Nodejs相互依赖的mysql查询

时间:2017-11-21 16:39:34

标签: mysql node.js

我正在尝试用nodejs编写两个mysql查询。第二个查询使用第一个查询的结果。问题是第二个查询在第一个查询尚未完成时开始执行。 我有什么想法可以解决这个问题? 谢谢 !以下是代码:

let userId;
let username;
let password;
let token;

connection.query("SELECT user_id from proxy_pairs WHERE id = " + connection.escape(proxyPairId), function(err, rows, fields) {
    if (err) throw err

    userId = rows[0].user_id;
})


connection.query("SELECT username, password, token from accounts WHERE id = " + connection.escape(userId), function(err, rows, fields) {
    if (err) throw err

    username = rows[0].username;
    password = rows[0].password;
    token = rows[0].token;

})

2 个答案:

答案 0 :(得分:0)

在回调中进行第二次调用:

connection.query("SELECT user_id from proxy_pairs WHERE id = " + connection.escape(proxyPairId), function(err, rows, fields) {
    if (err) throw err

    userId = rows[0].user_id;

    connection.query("SELECT username, password, token from accounts WHERE id = " + connection.escape(userId), function(err, rows, fields) {
    if (err) throw err

    username = rows[0].username;
    password = rows[0].password;
    token = rows[0].token;

  })
})

根据您使用的节点版本而不是回调,我建议使用promisesasync/await来构建查询。

答案 1 :(得分:0)

这不起作用,因为查询将异步执行。要完成这项工作,您有3个选择。

  1. 嵌套通话。

  2. 使用承诺。

  3. 使用async / await。

  4. 最简单的方法是嵌套调用。

    这适用于嵌套调用。

    let userId;
    let username;
    let password;
    let token;
    
    connection.query("SELECT user_id from proxy_pairs WHERE id = " + connection.escape(proxyPairId), function(err, rows, fields) {
        if (err) throw err
    
        userId = rows[0].user_id;
    
        connection.query("SELECT username, password, token from accounts WHERE id = " + connection.escape(userId), function(err, rows, fields) {
            if (err) throw err
    
            username = rows[0].username;
            password = rows[0].password;
            token = rows[0].token;
    
        })
    })
    

    对于不同的解决方案,您应该参考promises和async / await。我希望承诺或异步/等待这种情况,但你可以自由选择。