Как получить объект без переноса квадратных скобок в PostgreSQL, используя Node.js и экспресс?
Я использую PostgreSQL с https://node-postgres.com/api/pool, Node.js и express для выполнения простых запросов. Я получаю взамен объект, заключенный в квадратные скобки, но я бы хотел получить его без него.
EmployeeDA.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;
};
The conrtoller.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_WRAPPER
Есть ли что-то подобное в PostgreSQL? Я ищу лучшее решение, чем resolve(results.rows[0])
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
поддержка, так что вам не нужно писать свою собственную оболочку обещания. Вы могли бы сделать:
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