KNEXjs по-разному обрабатывает вывод функции JSON_AGG для отдельных строк и нескольких строк

У меня есть две функции маршрутизации, одна из которых получает одну запись, а другая - несколько записей - единственное различие между этими двумя функциями состоит в том, что функция с одной записью имеет предложение WHERE.

Когда я запускаю функцию одной записи, я получаю объект с одним из полей, превращенным в массив, чего я и ожидал. Когда я запускаю функцию с несколькими записями, это же поле возвращается как экранированная строка для каждой из строк.

Вот каждая из функций маршрута:

server.get("/api/projects", async (req, res) => {
  const rows = await knex
    .select(
      "projects.name",
      "projects.thumbnail",
      "projects.website",
      knex.raw(`JSON_ARRAYAGG(stacks.url) AS stacklist`)
    )
    .from("projects")
    .join("project_stacks", "projects.id", "=", "project_stacks.project_id")
    .join("stacks", "project_stacks.stack_id", "=", "stacks.id")
    .groupBy("projects.id");
  let data = [];
  for (let row of rows) {
    let o = {
      name: row.name,
      thumbnail: row.thumbnail,
      website: row.website,
      stacklist: row.stacklist.split(","),
    };
    data.push(o);
  }
  res.send(data);
});

server.get("/api/projects/:id", async (req, res) => {
  const rows = await knex
    .select(
      "projects.name",
      "projects.thumbnail",
      "projects.website",
      knex.raw(`JSON_ARRAYAGG(stacks.url) AS stacklist`)
    )
    .from("projects")
    .where("projects.id", req.params.id)
    .join("project_stacks", "projects.id", "=", "project_stacks.project_id")
    .join("stacks", "project_stacks.stack_id", "=", "stacks.id")
    .groupBy("projects.id");
  let data = {
    name: rows[0].name,
    thumbnail: rows[0].thumbnail,
    website: rows[0].website,
    stacklist: JSON.parse(unescape(rows[0].stacklist)),
  };
  res.send(data);
});

И вывод для каждого:

GET /api/projects:

[{"name":"Shortr","thumbnail":"Shortr.jpg","website":"www.shortr.getonthebahnwegon.com","stacklist":"React,Express,Node,MariaDB"},{"name":"The Designs of Dieter Rams","thumbnail":"www.s3.dieterrams.aws.com","website":"www.dieterrams.getonthebahnwegon.com","stacklist":"React,S3"},{"name":"The Designs of Dieter Rams","thumbnail":"www.s3.dieterrams.aws.com","website":"www.dieterrams.getonthebahnwegon.com","stacklist":"React,S3"}]

и GET /api/projects/:id

[{"name":"Shortr","thumbnail":"Shortr.jpg","website":"www.shortr.getonthebahnwegon.com","stacklist":"[\"React\",\"Express\",\"Node\",\"MariaDB\"]"}]

Я бы хотел, чтобы результат для GET /api/projects был таким же, как для GET /api/projects/:id

0 ответов

Другие вопросы по тегам