【问题标题】:How to set retrieve callback in mongoose, in a global variable如何在全局变量中在猫鼬中设置检索回调
【发布时间】:2015-08-18 15:13:18
【问题描述】:

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

var name;

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

console.log(name);

谢谢。

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

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

    发生了什么:

    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!
    }
    

    【讨论】:

    • 我想在全局变量中设置 db 来处理其他地方!
    • 就是这样。 name 是一个全局变量,不是吗?
    • 问题是 Node.JS 是异步的。不能在 db 查询回调之外直接设置全局名称和控制台日志。
    • 是的,全局变量很糟糕,从某种意义上说它们是“脏的”。变量应该封装在对象中,或者像我的解决方案一样,传递给必须使用它们的函数。我相信你应该考虑这一点并取得一些进展,而不是继续做你一直做的事情:) 但如果那是绝对你想要的,那么将它设置为全局变量......我已经更新了我的回答。
    • 没错。 PHP 按此顺序逐行执行。用javascript忘记它。一切都是异步的,您在准备就绪时获取数据,而不是之前。如果您尝试在此之前记录它,您将收到错误或意外结果。 Javascript 不会像 PHP 那样冻结等待数据。与此同时,它还做了其他事情。这就是 javascript 的力量,也是 Node 比 PHP 快很多的原因。所以你最好接受它:)
    猜你喜欢
    • 1970-01-01
    • 2018-02-17
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2020-06-09
    相关资源
    最近更新 更多