![](/img/trans.png)
[英]Function returning "undefined" while trying to query database in node.js
[英]Node.js: Undefined return value after database query
我有一個文件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),檢查數據庫中是否已存在代碼,如果存在則重新啟動函數或返回生成的代碼
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);
}
});
};
問題是,由於變量vericode為“未定義”,因此newuser.js引發錯誤(因此,貓鼬模型驗證失敗)。 如果我跳過數據庫查詢並立即返回生成的代碼,則不會發生該錯誤(實際上,該代碼的值已由多個console.log指令驗證)。 在我看來,數據庫查詢要在查詢完成之前返回long和空值或null值? 我曾想過要引入承諾,除非您有其他建議或暗示可能導致這種行為? 親切的問候
伊戈爾
由於查詢數據庫是非阻塞操作,因此不能期望函數調用立即從數據庫返回值。 嘗試傳遞回調:
// 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 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.