NodeJS + MongoJS:嵌套回调问题

NodeJS + MongoJS: Nested Callbacks Issue

我仍然是 NodeJS 的新手,所以这个问题可能有点初级。

我正在使用 MongoJS 读取两个逻辑相关的集合。第一个 find() return 是我传递给第二个 find() 的值,以获取我需要的信息。

我尝试了几种策略,最后一个(代码段 #1)是我导出的 class。

在此之前,我只有一个函数执行 return,returning 所需的值,即 "config[0]"。

在这段代码中,我所做的只是将 "sapConfig" 属性设置为单词 "test",但是当我执行这段代码时,"sapConfig" 的值始终是 "null"在我调用 "get_config()" 方法之后——最奇怪的是——对 "this.sapConfig = 'test'" 的引用产生了一个错误,即 "Cannot set property 'sapConfig' of undefined".

当我将代码作为一个带有 return 语句的简单函数(代码段 #2)时,没有生成任何错误,但值 returned 始终是 "undefined",尽管 console.log() 语句显示被 returned 的变量的值具有所需的值。给出了什么?

代码段 #1:Returns 对象

"use strict";

var mongojs = require('mongojs'); // MongoDB API wrapper

module.exports = function(regKey) {

    this.regKey = regKey;
    this.sapConfig = null;

    this.get_config = function() {

        // Read SAP connection information from our MONGO db
        var db = mongojs('mongodb://localhost/MIM', ['Configurations','Registrations']);

        db.Registrations.find({ key: this.regKey }, function(err1, registration){
            console.log('Reg.find()');
            console.log(registration[0]);
            db.Configurations.find({ type: registration[0].type }, function(err2, config){
                console.log('Config.find()');
                console.log('config=' + config[0].user);
                this.sapConfig = 'test';
            });
        });
    }

    this.get_result = function() {
        return this.sapConfig;
    }
}

同样,片段 #1 中的代码在我调用 "get_config()" 时会在执行行 "this.sapConfig = 'test'" 时导致错误。

然而,在这个错误之后我可以执行 "obj.get_result()" 并且我得到它被初始化的值,即 null。换句话说,相同的代码不会生成错误,指出 "this" 未定义为 .in the "get_config()" 方法

代码片段 #2:使用 "return" 语句

"use strict";

var mongojs = require('mongojs'); // MongoDB API wrapper

module.exports = function(regKey) {

        // Read SAP connection information from our MONGO db
        var db = mongojs('mongodb://localhost/MIM', ['Configurations','Registrations']);

        db.Registrations.find({ key: regKey }, function(err1, registration){
            console.log('Reg.find()');
            console.log(registration[0]);
            db.Configurations.find({ type: registration[0].type }, function(err2, config){
                console.log('Config.find()');
                console.log('config=' + config[0].user);
                return config[0].user;
            });
        });
}

当我收到 return 值并检查它时,它是 "undefined"。例如,在节点 CL 上,我发出以下命令:

var config = require('./config') // The name of the module above
> var k = config('2eac44bc-232d-4667-bd24-18e71879f18c')
undefined <-- this is from MongoJS; it's fine
> Reg.find() <-- debug statement in my function
{ _id: 589e2bf64b0e89f233da8fbb,
  key: '2eac44bc-232d-4667-bd24-18e71879f18c',
  type: 'TEST' }
Config.find()
config=MST0025
> k <-- this should have the value of "config[0]"
undefined

可以看到查询成功了,但是"k"的值为"undefined"。这是怎么回事?

我不在乎我使用哪种方法,我只需要其中一种方法即可。

提前致谢!

this.sapConfig 无法访问。那是因为 this 在当前函数中引用。我喜欢做的是有一个变量,它引用您知道 sapConfig 所在的函数实例。

例如:

function Foo() {
   var self = this;

   this.test = "I am test";

   var bar = function(){
     return function(){
       console.log(this.test); //outputs undefined (because this refers to the current function scope)
       console.log(self.test); //outputs "I am test";
     }
   }
}

这是您实现我的示例的第一个代码片段:

"use strict";

var mongojs = require('mongojs'); // MongoDB API wrapper

module.exports = function(regKey) {
  var self = this;

  this.regKey = regKey;
  this.sapConfig = null;

  this.get_config = function() {

    // Read SAP connection information from our MONGO db
    var db = mongojs('mongodb://localhost/MIM', ['Configurations', 'Registrations']);

    db.Registrations.find({ key: this.regKey }, function(err1, registration) {
      console.log('Reg.find()');
      console.log(registration[0]);
      db.Configurations.find({ type: registration[0].type }, function(err2, config) {
        console.log('Config.find()');
        console.log('config=' + config[0].user);
        self.sapConfig = 'test';
      });
    });
  }

  this.get_result = function() {
    return self.sapConfig;
  }
}

你的第二个片段。您正在尝试从嵌套回调中 return 一个值。由于嵌套函数是异步的,因此您不能这样做。

我喜欢这样 return 来自嵌套回调的值:

Ex2:

//Function example
var functionWithNested = function(done) {
  //Notice the done param. 
  //  It is going to be a function that takes the finished data once all our nested functions are done.

  function() {
    //Do things
    function() {
      //do more things
      done("resultHere"); //finished. pass back the result.
    }();//end of 2nd nested function
  }(); //end of 1st nested function
};

//Calling the function
functionWithNested(function(result) {
  //Callback
  console.log(result); //resultHere
})

这是您使用该示例的代码:

"use strict";

var mongojs = require('mongojs'); // MongoDB API wrapper

module.exports = function(regKey, done) {

  // Read SAP connection information from our MONGO db
  var db = mongojs('mongodb://localhost/MIM', ['Configurations', 'Registrations']);

  db.Registrations.find({ key: regKey }, function(err1, registration) {
    console.log('Reg.find()');
    console.log(registration[0]);
    db.Configurations.find({ type: registration[0].type }, function(err2, config) {
      console.log('Config.find()');
      console.log('config=' + config[0].user);
      done(config[0].user);
    });
  });
}

//Then wherever you call the above function use this format
// if config is the name of the function export above...

new Config().(regKey, function(result){

    console.log(result); //config[0].user value
})

代码很多很多,但我希望您能够理解。如果您还有其他问题,请告诉我!干杯。