如何使用Node.js和表达式在PostgreSQL中包装方括号而获取Object?

问题描述 投票:1回答:1

我正在使用带有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])更好的解决方案

javascript node.js postgresql express node-pg-pool
1个回答
1
投票

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

[
     {
      "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
© www.soinside.com 2019 - 2024. All rights reserved.