Nodejs MySql全局变量限制

时间:2015-03-10 03:22:29

标签: mysql node.js

为什么新的Monsters对象只在mysql函数范围内被调用时被填充?

    Monsters = {};
db.query('SELECT * from rpg_monsters ', function(err, results) {
        for(i=0; i < results.length; i++){
        Monsters[results[i].monster_id] = {
                monster_id: results[i].monster_id,
                monster_name: results[i].monster_name,
                monster_filename: results[i].monster_filename,
                monster_hp: results[i].monster_hp,
                monster_chp: results[i].monster_hp,
                monster_type: results[i].monster_type,
                monster_level: results[i].monster_level,
                xPosition: results[i].monster_xPosition,
                yPosition: results[i].monster_yPosition
            }
        }
 console.log(Monsters); // This Returns True with all the objects properties!
db.end();
});
console.log(Monsters); // This Returns Empty?

是否可以使用mysql回调之外的Monsters对象(或任何)?

1 个答案:

答案 0 :(得分:1)

简短回答:不。

答案很长:欢迎使用NodeJS中的异步编程!您的错误不是由于范围问题,而是时间问题!您的异步代码不按源顺序运行。您的代码执行此操作:

  1. 初始化全局变量Monsters引用空的Javascript对象
  2. db.query提交异步请求,并使用params err和结果传递回调
  3. console.log Monsters的内容,仍然引用空数组
  4. NodeJS到达它的主循环结束并打勾。在等待db.query完成其异步IO时,这可能会发生很多次。在未来的某个时刻,我们将恢复:

    1. db.query解析并运行您的回调函数。
    2. results中的所有元素克隆到全局变量Monsters
    3. 中的对象中
    4. Monsters
    5. 的日志值

      您需要重新构建代码以遵循异步回调结构,或者您可以调查Promisescoroutines等替代方案。

      请参阅How to return the response from an asynchronous call?,它解释了您的问题。