Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在同一块中得到不同的数组值?_Javascript_Arrays_Node.js_Api_Foreach - Fatal编程技术网

Javascript 为什么在同一块中得到不同的数组值?

Javascript 为什么在同一块中得到不同的数组值?,javascript,arrays,node.js,api,foreach,Javascript,Arrays,Node.js,Api,Foreach,我正在使用node.js作为我的应用程序的api。 问题是在这段代码中,我正在编辑forEach循环中数组的值,但当我console.log()它们时,我仍然得到空数组。 我认为forEach循环是在位置2的console.log()之后以及在发送响应之后执行的。 记录在案,在位置1,我得到了我想要的正确值 这是密码 router.post('/', (req, res, next) => { userId = req.body.userId; sqlQuery = `S

我正在使用node.js作为我的应用程序的api。 问题是在这段代码中,我正在编辑forEach循环中数组的值,但当我console.log()它们时,我仍然得到空数组。 我认为forEach循环是在位置2的console.log()之后以及在发送响应之后执行的。 记录在案,在位置1,我得到了我想要的正确值

这是密码

router.post('/', (req, res, next) => {
    userId = req.body.userId;

    sqlQuery = `SELECT mealsids FROM tmporders WHERE userid = ${userId}`;

    con.query(sqlQuery, function (err, rows) {
        let mealsIds = [];
        let mealsNames = [];
        let mealsPrices = [];
        let mealsImages = [];
        var index = 0

        if (rows['rows'].length > 0) {
            mealsIds = rows['rows'];

            mealsIds[0]['mealsids'].forEach((row) => {

                sqlQuery2 = `SELECT name, image, price FROM meals WHERE id = ${mealsIds[0]['mealsids'][index]}`;

                con.query(sqlQuery2, function (err, rows) {
                    if (err) {
                        console.log('Failed BITCH');
                        res.sendStatus(202)
                    } else {
                        mealsNames.push(rows['rows'][0]['name']);
                        mealsPrices.push(rows['rows'][0]['price']);
                        mealsImages.push(rows['rows'][0]['image']);

                        /*   POSITION 1   */
                        console.log('============POSITION 1============');
                        console.log(mealsNames);
                        console.log(mealsPrices);
                        console.log(mealsImages);

                        /*  END OF POSITION 1   */
                    }
                });
            });

            /*   POSITION 2   */
            console.log('============POSITION 2============');
            console.log(mealsNames);
            console.log(mealsPrices);
            console.log(mealsImages);

            /*  END OF POSITION 2   */


            res.json({
                statusCode: 201,
                count: mealsNames.length,
                mealsIds: mealsIds,
                mealsNames: mealsNames,
                mealsImages: mealsImages,
                mealsPrices: mealsPrices
            })

        } else {
            console.error("Failure");
            console.log(err);
            res.sendStatus(202);
        }
    });
});

有什么方法可以修复这个逻辑错误吗?

试试这个,它可能会使代码出错,但是您仍然可以按照这个模式更好地开发代码

constquery=conn=>Query=>newpromise((解析,拒绝)=>{
试一试{
conn.query(query,(err,res)=>{
如果(错误)返回拒绝(错误)
解析(res.rows)
})
}捕获(er){
拒绝(er)
}
})
router.post('/',异步(req,res,next)=>{
试一试{
常量查询=查询(con);
userId=req.body.userId;
const rows=wait查询(`SELECT mealsid FROM tmporders,其中userid=${userid}`)
如果(!rows.length){
返回res.status(202).json({
消息:“0行”
})
}
console.log({rows})
mealsIds=rows.rows;
console.log({mealsIds})
const-fines=wait-mealsIds[0]。mealsIds.reduce((promise,e)=>promise.then(async-acc=>{
const currentResult=wait query(`SELECT name,image,price FROM founds,其中id=${mealsIds[0]。mealsIds[0]}`)
返回acc.concat(当前结果[0])
}),Promise.resolve([]))
console.log({founds})
res.status(200).json({
餐
})
}捕捉(错误){
res.status(500).json(err)
}
});
顺便说一句,您的节点版本必须高于8.0才能运行此代码。
在终端中尝试
node-v

异步逻辑不能保证顺序。从技术上讲,最后一个查询可以在
forEach
中的第一个查询之前执行,您需要使用Promise API而不是回调。例如,使用
mysql2/promise
发送mySQLquery@BadDobby感谢您的回答,但老实说,我不知道如何阅读Mario Casciaro和Luciano Mammino编写的
node js设计模式。这是一本相当古老的书,但它仍然对你有很大帮助。@ BADOBBY就是这样一种在另一条路线上获取数据的方法,所以我认为我在这里做了一些错误的事情,IDK,无论如何,谢谢,我会考虑阅读这本书。谢谢,我会编辑变量名并尝试它的AWAYOH,我有12版本的节点。JSIT的伟大。如果你不太忙,也要考虑阅读这篇文章: