【问题标题】:How to return async data from a mysql query in a function using node.js?如何使用node.js从函数中的mysql查询返回异步数据?
【发布时间】:2014-10-16 18:54:48
【问题描述】:


我是来自 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

【问题讨论】:

标签: node.js asynchronous


【解决方案1】:
  1. 为您的函数添加一个名为回调的参数 - 这是您的回调函数: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 });

【讨论】:

  • 在我阅读了关于回调的所有内容之后,无论出于何种原因,这变得更有意义并且它点击了。谢谢。
【解决方案2】:

您只需将其作为节点的一部分来接受。您可以使用各种不同的范例来处理它。最简单的是节点首选的 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
});

【讨论】:

    【解决方案3】:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-20
      • 2020-09-12
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 2018-01-03
      • 2021-08-16
      相关资源
      最近更新 更多