Я получил 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: '[email protected]' }
Я уже некоторое время сижу с ним, пробовал пару способов, найденных в уроках и стеке, но мне не повезло с этим.
Любая помощь будет оценена!
Я решил проблему, вернув 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');
Спасибо за попытку, хотя!
Вы можете использовать функцию сокращения 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);
[edit] Просто отредактировал фрагмент, чтобы результат был точно таким же
requestedOrderByPizzeriaID
иrequestedOrderByStatus
непосредственно в запросе без надлежащего экранирования - очень плохая идея, поскольку его можно использовать для инъекций sql. Вместо этого вы должны использовать подготовленные заявления или заполнители. Пользователь может использовать что-то вроде этого/orders/' OR TRUE OR '/:status
качестве URL.