Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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 推送时NodeJS数组结果为空_Javascript_Node.js_Express - Fatal编程技术网

Javascript 推送时NodeJS数组结果为空

Javascript 推送时NodeJS数组结果为空,javascript,node.js,express,Javascript,Node.js,Express,我试图将数据库中的数据推送到数组中,但在这里我遇到了一个小问题,当我尝试console.log时,它显示为空 这是我的密码: var arrTodo =[]; conn.query(todoq,function(err, rows, fields) { rows.forEach(function(detail){ arrTodo.push(detail.name); }); }); console.log(arrTodo); 有人能帮我放吗 试试这个 v

我试图将数据库中的数据推送到数组中,但在这里我遇到了一个小问题,当我尝试
console.log时,它显示为空

这是我的密码:

var arrTodo     =[];
conn.query(todoq,function(err, rows, fields) {
    rows.forEach(function(detail){
        arrTodo.push(detail.name);
    });
});
console.log(arrTodo);
有人能帮我放吗

试试这个

var arrTodo     =[];
conn.query(todoq,function(err, rows, fields) {
    rows.forEach(function(detail){
        arrTodo.push(detail.name);
    });
    console.log(arrTodo);
});

正如注释中提到的,
conn.query
是异步的。因此,您提供的回调将在稍后某个时候调用,而您已经在控制台上记录了它

您可以使用承诺来解决您的问题:

function getQuery() {
    return new Promise(function (resolve, reject) {
        conn.query(todoq,function(err, rows, fields) {
            var arrTodo = [];

            if (err) {
                return reject(err);
            }

            rows.forEach(function(detail){
                arrTodo.push(detail.name);
            });

            return resolve(arrTodo);
        });
    });
}

getQuery().then(arrTodo => console.log(arrTodo)).catch(err => console.error(err));
另外,您可以使用
arr.map
方法稍微改进代码,如下所示:

function getQuery() {
    return new Promise(function (resolve, reject) {
        conn.query(todoq,function(err, rows, fields) {
            if (err) {
                return reject(err);
            }

            let arrTodo = rows.map(function(detail){
                return detail.name;
            });

            return resolve(arrTodo);
        });
    });
}

getQuery().then(arrTodo => console.log(arrTodo)).catch(err => console.error(err));
有了承诺,您还可以使用async Wait:

(
    async function () {
        let arrTodo = await getQuery();
        console.log(arrTodo);
    }
)()

conn.query
是异步的吗?我猜
conn.query
是异步函数。如果要记录结果,请将
console.log
移动到
forEach
范围中。您必须解释为什么更改会有帮助。问题是什么。最初的问题是一个“新手Javascript 101”类的问题(一个重复的问题,其回答有5047张赞成票),但您的回答有助于指出使用和的潜力。干得好