最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

嵌套循环将Node.js中的每个记录序列化

IT培训 admin 9浏览 0评论

嵌套循环将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中的每个记录序列化

我正在使用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以获取更多信息。

发布评论

评论列表 (0)

  1. 暂无评论