Node.js Express - отправка массива в формате json (res.json) - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть app.get вот так:

app.get('/orders/:pizzeriaID/:status', async (req, res) => {
try {
    const requestedOrderByPizzeriaID = req.params['pizzeriaID'];
    const requestedOrderByStatus = req.params['status'];
    console.log("STATUS" + requestedOrderByStatus);
    const client = await pool.connect();
    const result = await client.query('SELECT od.orderID, od.pizzaID, od.pizzaOrderQuantity, o.orderName, o.orderAddress, o.orderComment, o.orderPhone, o.orderEmail FROM ordersDetails od NATURAL JOIN pizzeria p  NATURAL join orders o WHERE p.pizzeriaID=\'' + requestedOrderByPizzeriaID + '\' AND o.orderStatus=\'' + requestedOrderByStatus + '\'');
    const results = (result) ? result.rows : null;
    res.json({results});
    client.release();
} catch (err) {
    console.error(err);
    res.send("Error " + err);
}});

В такой модели базы данных: DBModel

Она отображает JSON так: JSON1

Я хотел бы иметь только один объект с orderid = 1, внутри которого есть второй json (массив?) Со списком pizzaID и pizzaOrderQuantity.

Способ, подобный этому, нужен:

results:{ 
  orderid: 1,
  orderDetails: [{ 
   pizzaid: 1,
   pizzaorderquantity: 2,
    },
   pizzaid: 2,
   pizzaorderquantity: 4,
    },
   pizzaid: 3,
   pizzaorderquantity: 1,
    }],
   ordername: 'Karol Piwnicki',
   orderaddress: 'Rydla 26/30',
   ordercomment: 'Szybko poprosze',
   orderphone: '111-222-333',
   orderemail: 'mail@mail.com' }

Я уже некоторое время с ним сижу, пробовал пару способов, найденных в уроках и стеке, но безуспешно.

Буду признателен за любую помощь!

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Я решил проблему, вернув json в SQL-запросе и переключив res.json () с помощью res.send ().

Для справки я использовал такой запрос:

const result = await client.query('select row_to_json(x) AS order 
FROM (select o.orderID, json_agg(json_build_object(\'pizzaID\',o.pizzaID, \'pizzaOrderQuantity\', o.pizzaOrderQuantity)) AS orderDetails, 
ord.orderName, ord.orderAddress, ord.orderComment, ord.orderPhone, ord.orderEmail FROM ordersDetails o 
NATURAL JOIN pizzeria p NATURAL JOIN orders ord 
WHERE p.pizzeriaID=\'' + requestedOrderByPizzeriaID + '\' GROUP BY o.orderID, ord.orderName, ord.orderAddress, ord.orderComment, ord.orderPhone, ord.orderEmail) as x');

Спасибо за попытку!

0 голосов
/ 19 декабря 2018

Вы можете использовать Javascripts уменьшить функцию для группировки заказов, а затем Object.values ​​, чтобы преобразовать его обратно в массив.

const json = Object.values(results.reduce((acc, order) => {
if (!acc[order.orderid]) {
    acc[order.orderid] = {
        orderid: order.orderid,
        orderDetails: []
    };
}
acc[order.orderid].orderDetails.push(order)
return acc
}, {}))

res.json(json);

[править] Просто отредактировал фрагмент, чтобы вывод был точно таким же

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...