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