如何在全局变量中设置mongoose中的检索回调

时间:2015-06-04 06:31:51

标签: javascript node.js mongodb express mongoose

我想在全局变量中设置db,但当我从name函数中获取控制台findOne时,显示未定义,我该怎么办?

var name;

schema.findone({name : 'Bob'} , function(er , db){
  name = db;
  console.log(db);
});

console.log(name);
谢谢。

1 个答案:

答案 0 :(得分:7)

关于异步的超级经典初学者错误:)

发生了什么:

var name; // FIRST you declare the name variable

schema.findone({name : 'Bob'} , function(er , db){ // SECOND you launch a request to the DB
  name = db; // FOURTH name is populated.
  console.log(db);
});

console.log(name); // !! THIRD !! you log name - it's empty

你应该做什么:

schema.findone({name : 'Bob'} , function(er , db){
  doSomethingElse(db);
});

function doSomethingElse(name){
    console.log(name); // It's defined.
}

你甚至不会声明一个全局变量,因为这是一个不好的做法。 一旦数据可用,将其传递给另一个函数并对其执行某些操作。所以你不会污染你的全球范围。

编辑:由于某些原因您绝对需要全局变量,请执行以下操作:

var name;

schema.findone({name : 'Bob'} , function(er , db){
  name = db;
  console.log(name); // works fine
  doSomethingElse();
});

console.log(name); // name is empty here, because the DB request is still in progress at this stage

function doSomethingElse(){
    console.log(name); // Tadaaaa! It's a global variable and is defined!
}