2014-09-01 76 views
0

我得到包含下面的代碼文件newuser.js(node.js的環境特色通過貓鼬管理MongoDB數據庫):Node.js的:數據庫查詢後未定義返回值

//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是'未定義'(因此貓鼬模型驗證失敗)。如果我跳過數據庫查詢並立即返回生成的代碼(事實上它已經通過幾個console.log指令驗證了值),則不會發生該錯誤。我發現數據庫查詢需要很長時間,並且在查詢完成之前返回空值或空值?我想過介紹承諾,除非你有任何其他的建議或暗示可能會導致這種行爲? 親切的問候

伊戈爾

回答

0

由於查詢數據庫是一個非阻塞操作,你不能指望函數調用從數據庫立即返回值。嘗試在回調中傳遞,而不是:

// 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); 
    } 
    }); 
}; 
+0

我明白了......猜猜我必須仔細看看node.js的回調結構......現在工作。謝謝 – 2014-09-02 12:21:43

0

您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

+0

會看看包裝。現在就自己實施。也許我遲早會換。感謝您的建議。乾杯,伊戈爾。 – 2014-09-02 12:22:42