【问题标题】:Javascript function return always undefinedJavascript函数返回总是未定义
【发布时间】:2015-07-11 00:08:52
【问题描述】:

JS 新手,所以我希望我的错误很容易修复。

所以我在users.js 文件中创建了一个函数:

exports.authenticate = function(user){
User.findOne({
    'username':user.username,
    'password':user.password,
},'username', function (err, dbuser) {
        if (err) return handleError(err);
        console.log(Boolean(dbuser));
        return Boolean(dbuser);

    });
}

所以我将我的 dbuser 的值作为布尔值返回:如果他存在,则为 true,否则为 false。很简单不是吗?但是陷阱来了..

var userClass = require('./users.js');
var myUser = userClass.create('xxazeddax','azezaeazeazeaz','mazeazeazezaeaze');
var authent  = userClass.authenticate(myUser);
console.log(authent);

这里我期待一个布尔值,因为它是 authenticate() 唯一可以返回的东西。但不是,我没有定义。 请问,我哪里做错了?

【问题讨论】:

  • 如果你调试这个,err 在被调用时会提供给你的匿名函数吗?
  • 你听说过 JS 中的异步方法吗?就是这样。

标签: javascript function mongoose


【解决方案1】:

您的function(user) 又名authenticate 不会返回任何内容您的其他函数function (err, dbuser) 是一个回调函数,这意味着它将在请求完成时执行,但是,由于它是一个回调函数,这意味着function(err, dbuser) 并不是按顺序执行的。

我推荐你这篇文章来了解发生了什么

http://www.impressivewebs.com/callback-functions-javascript/

我快速查看发生了什么以这种方式更改您的代码:

function(user){
     User.findOne({'username':user.username,'password':user.password},'username', 
     function (err, dbuser) {
        if (err) return handleError(err);
        console.log(Boolean(dbuser));
        return Boolean(dbuser);
    });
  return true; //<-- authenticate will always return true
}

【讨论】:

  • 嗨,感谢您的精彩文章。问题是如果用户通过身份验证,我希望我的 authenticate(user) 返回一个布尔值。是否存在强制回调按顺序执行的方法? (我想不是)。我不能在回调中使用我的 dbuser var,那么如何检查 dbuser 的值以返回适当的布尔值?
猜你喜欢
  • 2018-03-12
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多