Javascript Node.js:数据库查询后返回值未定义
我得到了一个文件newuser.js node.js environment,其中包含一个通过mongoose管理的mongodb数据库,其中包含以下代码: //newuser.js //基本上,在数据库中创建新的用户文档,并使用GET参数和外部生成的随机代码参见randomcode.jsJavascript Node.js:数据库查询后返回值未定义,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我得到了一个文件newuser.js node.js environment,其中包含一个通过mongoose管理的mongodb数据库,其中包含以下代码: //newuser.js //基本上,在数据库中创建新的用户文档,并使用GET参数和外部生成的随机代码参见randomcode.js [...] var randomCode = require ('randomcode'); var newTempUser = new tempUser({name: req.body.name, ver
[...]
var randomCode = require ('randomcode');
var newTempUser = new tempUser({name: req.body.name, vericode: randomCode.randomveriCode(parameter)
});
newTempUser.save(function (err){
//some output
});
//randomcode.js
[...]
var randomCode = require ('randomcode');
var newTempUser = new tempUser({name: req.body.name, vericode: randomCode.randomveriCode(parameter)
});
newTempUser.save(function (err){
//some output
});
//创建一个随机字符序列=vericode,检查数据库中是否已经存在代码,如果已经存在,则重新启动函数或返回生成的代码
exports.randomveriCode = function randomveriCode(parameter){
[...]
var TempUser = conn.model('TempUser', TempUserSchema);
TempUser.count({vericode: generatedcode}, function(err, counter){
if (counter=='0'){
return generatedcode;
}else{
randomveriCode(parameter);
}
});
};
问题是,newuser.js抛出一个错误,因为变量vericode“未定义”,所以mongoose模型验证失败。如果我跳过数据库查询并立即返回生成的代码,则不会发生此错误,事实上,该代码已获得多条console.log指令验证的值。我突然想到,在查询完成之前,db查询需要返回很长的空值或null值?我想介绍承诺,除非你有任何其他的建议或提示,什么可能导致这种行为?
问候
Igor由于查询数据库是一种非阻塞操作,因此不能期望函数调用立即从数据库返回值。请尝试传入回调:
// newuser.js
var randomCode = require('randomcode');
randomCode.randomveriCode(parameter, function(err, code) {
if (err) throw err; // TODO: handle better
var newTempUser = new tempUser({name: req.body.name, vericode: code});
newTempUser.save(function (err){
//some output
});
});
// randomcode.js
exports.randomveriCode = function randomveriCode(parameter, cb) {
var TempUser = conn.model('TempUser', TempUserSchema);
TempUser.count({vericode: generatedcode}, function(err, counter) {
if (err) return cb(err);
if (counter == '0') {
cb(null, generatedcode);
} else {
randomveriCode(parameter, cb);
}
});
};
randomveriCode函数包含对异步函数的调用,因此,函数确实需要提供如下回调参数:
exports.randomveriCode = function randomveriCode(parameter, callback){
[...]
var TempUser = conn.model('TempUser', TempUserSchema);
TempUser.count({vericode: generatedcode}, function(err, counter){
if(err) return callback(err);
if (counter=='0'){
return callback(null, generatedcode);
}else{
randomveriCode(parameter, callback);
}
});
};
你可以这样称呼它:
var randomCode = require ('randomcode');
randomCode(function(err, vericode){
if(err) throw err;
var newTempUser = new tempUser({name: req.body.name, vericode: vericode});
newTempUser.save(function(err,newUser){
//do something here
});
});
顺便说一句,您还可以使用同步函数来创建GUID。看 我明白了。。。我想我必须仔细看看node.js的回调结构。。。现在工作。谢谢。我来看看包裹。现在我自己实现了它。也许我迟早会换的。谢谢你的建议。干杯,伊戈尔。