Node.js Express - отправка массива в формате json (res.json)

1

Я получил 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]' }

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

Любая помощь будет оценена!

  • 0
    Использование requestedOrderByPizzeriaID и requestedOrderByStatus непосредственно в запросе без надлежащего экранирования - очень плохая идея, поскольку его можно использовать для инъекций sql. Вместо этого вы должны использовать подготовленные заявления или заполнители. Пользователь может использовать что-то вроде этого /orders/' OR TRUE OR '/:status качестве URL.
Теги:
express

2 ответа

0

Я решил проблему, вернув 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

Вы можете использовать функцию сокращения 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] Просто отредактировал фрагмент, чтобы результат был точно таким же

Ещё вопросы

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