Nodejs使用错误的工作流进行回调

时间:2015-06-09 08:32:55

标签: javascript mysql node.js

我是NODE的新手,我正在尝试使用此代码:

require('./constants.js');
var aar = require('./libs/DBManager.js')
console.log('Loading DBManager');    
var player = aar.findPlayer('Potter');    
console.log(player);

之后,我发了一个laucher文件:

Group

正确的工作流程是:

  • 正在加载DBManager
  • 数据库已连接...
  • 查找 - >波特
  • 玩家:Potter
  • 关闭数据库连接

但结果是:

  • 正在加载DBManager
  • 查找 - >波特
  • 关闭数据库连接
  • 未定义
  • 数据库已连接...
  • 玩家:Potter

我错了什么?有一些回调问题吗?

2 个答案:

答案 0 :(得分:2)

在确定完成查询之前,您正在关闭连接。 你应该在查询结束后但在回调中放置dbDisconnect(connection);

connection.query(query, function(err, rows, fields) 
    {
        if (err) throw err;

        for (var i in rows) {
            console.log('Players: ', rows[i].surname);
        }  
       dbDisconnect(connection); 
    });

同样,findPlayer没有返回任何内容,因此console.log(player);将是未定义的

答案 1 :(得分:0)

Javascript本质上是异步的,它不等待I / O操作。包括连接到DB的请求在内的任何网络调用都在I / O操作下进行。

问题是您正在请求数据库连接,在返回之前,您正在调用以获取玩家的数据。我建议你将回调方法传递给

dbConnect(callback)

在该回调中,您传递了要执行的查询或操作:

  1. 创建一个回调方法,其中包含检索播放器信息的代码
  2. 调用 dbConnect()以建立与DB的连接并将回调作为参数传递
  3. 建立连接后,执行回调
  4. 完成后,您可以关闭连接,但要确保关闭连接的代码,在回调中,并且仅在您从Db收到数据后执行
  5. 相反,如果您对ORM感到满意,我建议您尝试Sequelize,它会抽象出创建和断开与DB的连接的要求,因此您可以专注于您的crud操作。