2015-07-11 162 views
1

新的JS,所以我期待我的错误很容易修复。JavaScript函数返回总是undefined

所以我去的功能在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的值作为一个布尔值:如果他的存在,否则为假。很简单没有?但是,来到陷阱..

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

在这里,我很期待一个布尔值,因为它是唯一的身份验证()可以返回。但是不,我不确定。 请问我哪里有错?

+0

如果调试这一点,在被调用时提供给匿名函数的是'err'? – kevin628

+1

您是否听说过JS中的异步方法?情况就是这样。 –

回答

3

function(user)又名为authenticate不返回任何你的其他功能function (err, dbuser)是一个回调函数这意味着它会在完成请求时,但被执行,因为它是一个回调funtion这意味着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 
} 
+0

嗨, 感谢您的伟大的文章。 问题是我想我的身份验证(用户)返回我一个布尔值,如果用户进行身份验证或不。 Doest是否存在一种强制回调按顺序执行的方式? (我想不是)。 我不能使用我的dbuser var回调,所以我如何检查dbuser的值以便返回一个合适的布尔值? –