提问者:小点点

node.js:数据库查询后返回值未定义


我得到了一个文件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查询需要返回很长的空值或空值?我想过,除非你有任何其他建议或暗示,否则我会给你一些承诺,什么可能会导致这种行为?亲切的问候

伊戈尔


共2个答案

匿名用户

由于查询数据库是一个非阻塞操作,您不能期望函数调用立即从数据库返回值。尝试传入回调:

// 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。