在节点js中获取promise错误

时间:2016-02-29 10:14:21

标签: javascript node.js express

服务器js:

var user_controller = require('./controllers/user_controller');
passport.use(new passportLocal(function(username, password, done) {
  user_controller.login(username, password).then(function(value) {
    if (value) {
      console.log(value + "true")

      done(null, {
        id: username,
        name: username
      });
    } else {
      console.log(value + "false");
      done(null, null);
    }
  })
}));

USer contoller:

module.exports.login = function(username, password) {
  var status;
  var userid = username;
  User.findOne({
    'username': [userid],
    'password': [password]
  }, function(err, user) {
    if (!user) {
      console.log("logged err");
      status = false;
    } else {
      console.log("login in");
      status = true;
    }
    console.log(status);
    return status;
  });
};

我正在我的user_controller.login中执行异步任务(db调用),它返回一个布尔值"值"

但当我执行此操作时,我收到错误:无法读取属性'然后'未定义的

我之前看到过有关此错误的问题但无法理解

2 个答案:

答案 0 :(得分:1)

我认为您可以尝试使用回调函数。 login函数接受一个回调参数并在结束时执行该函数。

module.exports.login = function(username, password, callback) {
  var status;
  var userid = username;
  User.findOne({
    'username': [userid],
    'password': [password]
  }, function(err, user) {
    if (!user) {
      console.log("logged err");
      status = false;
    } else {
      console.log("login in");
      status = true;
    }
    console.log(status);
    callback(status);
  });
};

调用函数login时,将第三个param作为回调函数传递。

var user_controller = require('./controllers/user_controller');
passport.use(new passportLocal(function(username, password, done) {
  user_controller.login(username, password, function(value) {
    if (value) {
      console.log(value + "true")

      done(null, {
        id: username,
        name: username
      });
    } else {
      console.log(value + "false");
      done(null, null);
    }
  })
}));

注意:我没有测试上面的代码。

答案 1 :(得分:0)

您可以使用Q库在Nodejs中创建基于承诺的函数。

npm install q

以下代码可以为您提供帮助。

module.exports.login=function(username,password){
var status;
var userid=username;

User.findOne({'username':[userid], 'password':[password]},function(err,user){
    var deferred = Q.defer();

    if(err){
       deferred.reject(err); 
    } else{
        deferred.resolve(data);
    }
    return deferred.promise;
});

并在Server.js

中使用它
var user_controller = require('./controllers/user_controller');
passport.use(new passportLocal(function(username, password, done) {
user_controller.login(username, password).then(function(user) {
  done(null, {
    id: username,
    name: username
  });
});