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

1

Я использую 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])

  • 0
    @a_horse_with_no_name Тип: VARCHAR (30)
  • 0
    Вероятно, есть какой-то компонент, который преобразует набор результатов запроса в JSON. Результирующий набор может иметь несколько строк, которые представлены в виде массива. Решение не в PostgreSQL, а в любом программном обеспечении, преобразующем результат в JSON.
Показать ещё 3 комментария
Теги:
express
node-pg-pool

1 ответ

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню