无法在Express Node.js中的查询功能之外获取结果

时间:2019-05-26 18:50:05

标签: node.js express asynchronous handlebars.js express-handlebars

即使我在查询之前定义了w_name,我仍试图在查询之外获取变量w_name的值,但是在查询之后却无法获取它。请检查代码和帮助:

connection.query('SELECT * FROM workstations WHERE id=?',[results[0].w_id],function(err,res,field){
                        w_name = res[0].name;
                });
                console.log(w_name);

console.log显示未定义,但如果我在console.log之后将w_name放入查询中,则显示正确的结果。怎么了?

3 个答案:

答案 0 :(得分:0)

connection.query(...params)是异步函数,需要一些时间来读取并获取传递给查询的结果数据。 定义console.log(w_name)时打印未定义,因为结果尚未分配给w_name变量。而在回调函数中定义它会将值分配给w_name。

查看this文章以了解异步javascript。

           connection.query('SELECT * FROM workstations WHERE id=?', 
                    [results[0].w_id],function(err,res,field){

                    w_name = res[0].name;
                      console.log(w_name);
            });

答案 1 :(得分:0)

NodeJs是异步的,它对结果使用回调。 据我所知,关于您的问题的最佳解决方案如下:

async function myQuery(){
     return new Promise((resolve,reject)=>{
            connection.query('SELECT * FROM workstations WHERE id=?',[results[0].w_id],function(err,res,field){
                    resolve(res[0].name)
            });

     })
}

现在,您可以使用then来获取值,也可以使用async await来获取值。

//this is where you would like to call that function.

async function index(){
    let w_name = await myQuery()
    console.log(w_name)
}

答案 2 :(得分:0)

在这里您可以使用Promise()resolve()查询结果。

const w_name = await new Promise(function(resolve, reject) {
        connection.query('SELECT * FROM workstations WHERE id=?', [results[0].w_id], function(err, res, field) {
            if (err) throw err
            resolve(res[0].name);
        })
    });
console.log(w_name);