【问题标题】:Node.js Express - send array in json (res.json)Node.js Express - 在 json (res.json) 中发送数组
【发布时间】:2018-12-20 04:04:41
【问题描述】:

我有一个 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(array?),其中包含 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' }

我已经使用它一段时间了,尝试了教程和堆栈中的几种方法,但没有成功。

任何帮助将不胜感激!

【问题讨论】:

  • 在查询中直接使用requestedOrderByPizzeriaIDrequestedOrderByStatus 而不进行适当的转义是一个非常糟糕的主意,因为它可以用于sql 注入。您应该改用准备好的语句或占位符。用户可以使用类似/orders/' OR TRUE OR '/:status 作为 url。

标签: javascript node.js postgresql express


【解决方案1】:

您可以使用 Javascripts 的reduce 函数对订单进行分组,然后使用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] 刚刚编辑了 sn-p,所以输出将完全相同

【讨论】:

    【解决方案2】:

    我已经通过在 SQL 查询中返回一个 json 并使用 res.send() 切换 res.json() 解决了这个问题。

    作为参考,我使用了这样的查询:

    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');
    

    感谢您的尝试!

    【讨论】:

      猜你喜欢
      • 2021-02-12
      • 2019-07-02
      • 2016-09-13
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      • 2014-02-10
      • 2017-01-06
      相关资源
      最近更新 更多