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
})
代码很多很多,但我希望您能够理解。如果您还有其他问题,请告诉我!干杯。
我仍然是 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
})
代码很多很多,但我希望您能够理解。如果您还有其他问题,请告诉我!干杯。