Как получить объект без переноса квадратных скобок в PostgreSQL, используя Node.js и экспресс? - PullRequest
1 голос
/ 10 апреля 2019

Я использую PostgreSQL с node-postgres: 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 Ответ

1 голос
/ 10 апреля 2019

Используемый соединитель возвращает строки в виде массива объектов так же, как в вашем результате:

[
     {
      "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
...