嵌套循环将Node.js中的每个记录序列化"/>
嵌套循环将Node.js中的每个记录序列化
我正在使用API来接收每个订单上的订单项目。我在收到订单商品详细信息时遇到问题。请查看下面的代码。
Controller.orderLists = (req, res, next) => {
--- some code ---
Model.Orders.findAll({
attributes: [
'order_id',
'status'
],
where: {
customer_id: req.customer_id,
status: 1
}
group: ['orders.order_id'],
limit: 1,
subQuery: false
}).then((orderList) => {
if (!_.isEmpty(orderList)) {
var results = [];
var index = 0;
orderList.forEach(function (order) {
getOrderInfo(order.order_id, function (err, items) {
console.log(items);
results[index] = {
'order_id': order.order_id,
'status': order.status,
'order_item': items
};
index++;
return results;
});
});
res.json({
status: 1,
msg: 'Order Lists',
data: results
});
} else {
res.json({
status: 1,
msg: 'Order not found',
data: results
});
}
}).catch((err) => {
console.error('ERROR :', err);
res.json({
status: -1,
msg: 'An error occured'
});
});
});
从模型中,我获得订单ID的列表。从列表中将运行每个订单到检索到的订单项目。我已经尝试了很多尝试代码,但是看起来没有运气。
function getOrderInfo(order_id, callback) {
--- 1st attempt code ---
return Model.OrderItem.find({
attributes: [
[Sequelize.literal('sum(quantity)'), 'total_quantity']
],
where: {
order_id: order_id
}
}).then((order_data) => {
callback(null, JSON.stringify(order_data.dataValues));
});
--- end 1st attempt code ---
--- 2nd attempt code ---
return Sequelize.model('order_items').findOne({
attributes: [
[Sequelize.literal('sum(quantity)'), 'total_quantity']
],
where: {
order_id: order_id
}
}).then((data) => {
return callback(null, data.dataValues);
});
--- end 2nd attempt code ---
--- 3rd attempt code ---
var sql = "SELECT SUM(quantity) AS total_quantity FROM order_items WHERE order_id = " + order_id;
Sequelize.query(sql, {
plain: true,
type: Sequelize.QueryTypes.SELECT
}).then((order) => {
callback(null, order);
});
--- end 3rd attempt ---
}
当前和预期结果:
Current:
{
"status": 1,
"msg": "Order Lists",
"data": []
}
Expected:
{
"status": 1,
"msg": "Order Lists",
"data": [
{
"order_id": 1234,
"status": 1,
"order_item": {
"total_quantity": "3"
}
},{
--- some data ---
}
]
}
预期数据应来自结果变量。日志显示有关承诺的一些警告。
0|AppServer: | 2020-05-14 14:12:09 +08:00: (node:4740) Warning: a promise was created in a handler but was not returned from it
0|AppServer: | 2020-05-14 14:12:09 +08:00: at Function.Promise.attempt.Promise.try (c:\xampp\htdocs\api\node_modules\bluebird\js\release\method.js:29:9)
我认为异步和等待脚本可能有问题。如何使脚本保持不变并让getOrderInfo()首先执行然后继续下一步?
[我需要帮助。谢谢
回答如下:getOrderInfo
异步操作并返回承诺。由于您不等待它,因此res.json(...)
会在承诺解决之前执行。您可以通过等待所有承诺来解决问题,并在then
处理程序中发送响应:
...
const orderPromises = [];
orderList.forEach(function (order) {
orderPromises.push(getOrderInfo(order.order_id));
});
Promise.all(orderPromises)
.then(results => {
res.json({
status: 1,
msg: 'Order Lists',
data: results
});
});
...
function getOrderInfo(order_id) {
return Model.OrderItem.find({
attributes: [
[Sequelize.literal('sum(quantity)'), 'total_quantity']
],
where: {
order_id: order_id
}
})
.then(order => {
return {
'order_id': order.order_id,
'status': order.status,
'order_item': items
}
})
}
请注意,我建议使用async/await
而不是纯粹的Promise,因为它可以大大提高代码的可读性->检查this以获取更多信息。
更多推荐
嵌套循环将Node.js中的每个记录序列化
发布评论