我得到了一个文件newuser.js(Node.js环境,具有通过mongoose管理的mongodb数据库),其中包含以下代码:
//newUser.js
//基本上是在数据库中创建新的用户文档,并接受一个GET参数和一个外部生成的随机代码(请参见randomcode.js)
[...]
var randomCode = require ('randomcode');
var newTempUser = new tempUser({name: req.body.name, vericode: randomCode.randomveriCode(parameter)
});
newTempUser.save(function (err){
//some output
});
//randomcode.js
//创建随机字符序列(=vericode),检查DB中是否已存在代码,如果存在则重新启动函数或返回生成的代码
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是“undefined”(因此mongoose模型验证失败)。如果我跳过数据库查询并立即返回生成的代码,则不会发生错误(实际上,该代码已经得到了一个值,正如几个console.log指令所验证的那样)。在我看来,在查询完成之前,db查询需要返回很长的空值或空值?我想过,除非你有任何其他建议或暗示,否则我会给你一些承诺,什么可能会导致这种行为?亲切的问候
伊戈尔
由于查询数据库是一个非阻塞操作,您不能期望函数调用立即从数据库返回值。尝试传入回调:
// 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。见https://www.npmjs.org/package/node-uuid。