Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js:数据库查询后返回值未定义_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

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

Javascript Node.js:数据库查询后返回值未定义,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我得到了一个文件newuser.js node.js environment,其中包含一个通过mongoose管理的mongodb数据库,其中包含以下代码: //newuser.js //基本上,在数据库中创建新的用户文档,并使用GET参数和外部生成的随机代码参见randomcode.js [...] var randomCode = require ('randomcode'); var newTempUser = new tempUser({name: req.body.name, ver

我得到了一个文件newuser.js node.js environment,其中包含一个通过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

[...]
var randomCode = require ('randomcode');

var newTempUser = new tempUser({name: req.body.name, vericode: randomCode.randomveriCode(parameter)
});

newTempUser.save(function (err){
    //some output
});
//创建一个随机字符序列=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);  
        }
    });
};
问题是,newuser.js抛出一个错误,因为变量vericode“未定义”,所以mongoose模型验证失败。如果我跳过数据库查询并立即返回生成的代码,则不会发生此错误,事实上,该代码已获得多条console.log指令验证的值。我突然想到,在查询完成之前,db查询需要返回很长的空值或null值?我想介绍承诺,除非你有任何其他的建议或提示,什么可能导致这种行为? 问候


Igor

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

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

我明白了。。。我想我必须仔细看看node.js的回调结构。。。现在工作。谢谢。我来看看包裹。现在我自己实现了它。也许我迟早会换的。谢谢你的建议。干杯,伊戈尔。