我正在使用带有node-postgres: pool的PostgreSQL,Node.js和express来进行一些简单的查询,我得到了用方括号包裹的对象,但我想在没有它的情况下得到它。
employee.is:
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;
};
controller.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"
]
}
正如here建议的那样,我在SQL Server中看到了一个处理这个的命令:WITHOUT_ARRAY_WRAPPER
在PostgreSQL中有类似的东西吗?我正在寻找比resolve(results.rows[0])
更好的解决方案
您正在使用的连接器将行返回为对象数组,就像在结果中一样:
[
{
"id": 8,
"first_name": "obos",
"last_name": "fomo",
"diet_list": [
"vegan",
"paleo"
]
}
]
您可以使用destructuring assignment提取结果,如:
// 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