如何使用node.js从函数中的mysql查询返回异步数据?

时间:2014-08-22 20:33:14

标签: node.js asynchronous


我是来自PHP背景的Node.js初学者 我正在使用mysql,模块node-mysql(Github:felixge / node-mysql),不幸的是它是异步的。
调试行“__2”出现在“__1”之前,因此函数在查询发生之前返回 我该怎么办?

var db = require('../classes/db.js')
var method = Usuario.prototype;

function Usuario() {
    // constructor
}

method.doAuth = function(usuario, senha) {
    var retorno = 0
    var sql = 'SELECT * from `tb_usuario` WHERE `usuario` = ? and `senha` = ?'
    db.query(sql, [usuario, senha], function(err, rows, fields) {
    if (err) throw err
    console.log("__1")
    if(rows.length > 0)
        retorno = rows[0].id        
    })
    console.log("__2")
    return retorno
}

module.exports = Usuario

3 个答案:

答案 0 :(得分:1)

  1. 在函数中添加一个名为callback的参数 - 这是您的回调函数:method.doAuth = function(usuario, senha, callback) {
  2. 在查询回调中,返回带有错误对象的回调和结果: db.query(sql, [usuario, senha], function(err, rows, fields) { .... if(rows.length > 0) retorno.id_usuario = rows[0].id; return callback(error, usuario);
    });
  3. 使用回调参数调用您的函数:
    doAuth(usuario, senha, function(error, result) { //handle error and result });

答案 1 :(得分:0)

您必须将此作为节点的一部分。您可以使用各种不同的范例来处理它。最简单的是节点的首选CPS:

method.doAuth(usuario, senha, callback) {
    db.query(query, functoin (err, rows, fields) {
        callback(err, fields);
    });
};

然后你会这样称呼:

lib.doAuth("key", "value", function (err, fields) {
    if (err) throw err;
    // do stuff with the rows
});

答案 2 :(得分:-1)

deasync正是您要找的。这将得到您想要的结果:

method.doAuth = function(usuario, senha) {
    var retorno = 0
    var sql = 'SELECT * from `tb_usuario` WHERE `usuario` = ? and `senha` = ?'

    var rows
    try{
      rows = require('deasync')(db.query)(sql, [usuario, senha])
    }
    catch(err) throw err
    console.log("__1")
    if(rows.length > 0)
        retorno = rows[0].id        
    })
    console.log("__2")
    return retorno
}