簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM