1

我正在使用 PostgreSQL 和node-postgres: pool, Node.js 和 express 来进行一些简单的查询,我得到了用方括号括起来的对象,但我想没有它。

员工DA.js:

const Pool = require("pg").Pool;
require("dotenv").config();

const pool = new Pool({
  user: process.env.USER,
  host: process.env.HOST,
  database: process.env.DATABASE,
  password: process.env.PASSWORD,
  port: process.env.PORT
});

const getOneDiet = id => {
  let p = new Promise((resolve, reject) => {
    return pool.query(
      `SELECT employee.id, employee.first_name, employee.last_name, array_agg(diet.description) AS diet_list
      FROM employee_diet
        INNER JOIN employee ON employee_diet.employee_id = employee.id
        INNER JOIN diet ON employee_diet.diet_id = diet.id
      WHERE employee.id = ${id}
      GROUP  BY 1`,
      (error, results) => {
        if (error) {
          console.log(error);
          reject(`ERROR: unable to get count: ${error}`);
        } else {
          resolve(results.rows);
        }
      }
    );
  });
  return p;
};

conttoller.js:

  const getEmployeeDiet = async (request, response) => {
  const id = parseInt(request.params.id);
  try {
    const employeeDiet = await employeeDA.getOneDiet(id);
    console.log(employeeDiet)
    response.status(200).json(employeeDiet);
  } catch (error) {
    console.log(error);
  }
}

结果:

[
     {
      "id": 8,
      "first_name": "obos",
      "last_name": "fomo",
      "diet_list": [
          "vegan",
          "paleo"
      ]
     }
]

我希望结果是:

{
      "id": 8,
      "first_name": "obos",
      "last_name": "fomo",
      "diet_list": [
          "vegan",
          "paleo"
      ]
}

正如这里所建议的,我看到在 SQL Server 中有一个命令可以处理这个问题:WITHOUT_ARRAY_WRAPPERPostgreSQL 中有类似的东西吗?我正在寻找比resolve(results.rows[0])

4

1 回答 1

1

您正在使用的连接器将行作为对象数组返回,就像您的结果一样:

[
     {
      "id": 8,
      "first_name": "obos",
      "last_name": "fomo",
      "diet_list": [
          "vegan",
          "paleo"
      ]
     }
]

您可以使用解构赋值来提取结果,例如:

// this assigns the first entry of the row to employeeDiet, same as employeeDiet = row[0]
const [employeeDiet] = await employeeDA.getOneDiet(id);
console.log(employeeDiet)
// outputs
{
  "id": 8,
  "first_name": "obos",
  "last_name": "fomo",
  "diet_list": [
    "vegan",
    "paleo"
  ]
}

此外,您使用的连接器已经提供Promise支持,因此您无需编写自己的 promise 包装器。你可以这样做:

const getOneDiet = async (id) => {
  let p;
  try {
    const result = pool.query(`SELECT employee.id, employee.first_name, employee.last_name, array_agg(diet.description) AS diet_list
    FROM employee_diet
    INNER JOIN employee ON employee_diet.employee_id = employee.id
    INNER JOIN diet ON employee_diet.diet_id = diet.id
    WHERE employee.id = ${id}
    GROUP  BY 1`);
    // object destructuring
    const { rows } = result;
    [p] = rows;
  });
  } catch (e) {
    throw e;
  }
  return p;
};

const employeeDiet = await employeeDA.getOneDiet(id);
// employeeDiet is an object like you wanted
于 2019-04-10T17:05:51.600 回答