【问题标题】:NodeJs receiving callback objectNodeJs 接收回调对象
【发布时间】:2017-01-06 19:04:27
【问题描述】:

我正在为我的应用程序开发身份验证模块。每当用户名和密码发布到 '/admin/login' Api 时,它都会调用 Auth 控制器的登录功能。 此外,我使用猫鼬模型从 MongoDb 中查询并将找到的对象返回给变量。

auth.controller.js

var jwt = require('jwt-simple');
var bcrypt = require('bcrypt');
var User = require('../models/user.model.js');
var secret = require('../config.js').jwt_secret;
var auth = {
login : function (req, res) {

    var username = req.body.username;
    var password = req.body.password;

    if (username === '' || password === '') {
        res.status(401).json({message : 'Invalid Credentials'});
        return;
    }

    var dbUserObj = auth.validate(username, password); // receives the User object returned from callback

        console.log(dbUserObj); //displays 'undefined'

    if (!dbUserObj) {

        res.status(401).json({message : 'Invalid Username or Password'});
        return;
    }

    if (dbUserObj) {
        console.log('user found');
        res.json(genToken(dbUserObj));
    }
},

validate : function (user, pass) {
      User.findOne({username : user}, function (err, user) {
        if (err) {
            return;
        }
        if (user==null) {
            console.log('no user found');
            return;
        } else {

            bcrypt.compare(pass, user.password, function (err,result) {
             if (result == true) {
                return user;
             }
         });
        }

      });
}
 }


function genToken (user) {
  var expires = expiresIn(7);
  var token = jwt.encode({exp : expires},secret);
  return {
    token : token,
    exp : expires,
    user: user
  }
}

function expiresIn (t) {
var dateObj = new Date();
return dateObj.setDate(dateObj.getDate() + numDays); 
}

 module.exports = auth;

dbUserobject 变量接收 validate 函数返回的 User 对象。但是如果我记录这个变量,它会显示“未定义” 我知道存在回调问题,即下一行代码运行,并且在回调返回对象 dbUserObject 变量被初始化后,它总是发送响应“无效的用户名或密码”,因为 dbUserObject 变得未定义。 试了好几样,都搞不定。

我怎样才能让它像它首先接收 DbUserObj 然后决定是发送无效响应还是生成 Json Web 令牌一样工作。

谢谢,

【问题讨论】:

    标签: javascript node.js mongodb mongoose callback


    【解决方案1】:

    由于 SyncAsync 函数存在问题,因为您的 auth.validate 表现为异步而不是等待结果,因为哪个用户对象未定义,您可以通过以下方式解决此问题使用Promise试试这个

    var auth = {
    login : function (req, res) {
    
        var username = req.body.username;
        var password = req.body.password;
    
        if (username === '' || password === '') {
            res.status(401).json({message : 'Invalid Credentials'});
            return;
        }
    
            auth.validate(username, password)
            .then(function(dbUserObj) { // `validate` returns a promise
            console.log(dbUserObj); // Log the value once it is resolved
                    if (!dbUserObj) {
    
                        res.status(401).json({message : 'Invalid Username or Password'});
                        return;
                    }
    
                    if (dbUserObj) {
                        console.log('user found');
                        res.json(genToken(dbUserObj));
                    }
    
            console.log(dbUserObj); //displays 'undefined'
    
            }).catch(function(v) {
            // Or do something else if it is rejected 
            // (it would not happen in this example, since `reject` is not called).
            });
    
    
    
    
    
    },
    
    validate : function (user, pass) {
            return new Promise(function(resolve, reject) {
    
               User.findOne({username : user}, function (err, user) {
                if (err) {
                    return;
                }
                if (user==null) {
                    console.log('no user found');
                    return;
                } else {
    
                    bcrypt.compare(pass, user.password, function (err,result) {
                     if (result == true) {
                        return user;
                     }
                 });
                }
    
              });
            // Only `delay` is able to resolve or reject the promise
            setTimeout(function() {
              resolve(user); // After 3 seconds, resolve the promise with user
            }, 3000);
            });
        }
     }
    

    【讨论】:

    • Wasiq,谢谢你。现在我明白了,但你能详细说明一下延迟吗?为什么需要延迟?我会立即获得用户吗?如果我必须使用延迟,为什么不应该使用延迟回调?
    • 因为callbackpromise 相同,但promise 是更易于管理的代码。您也可以立即使用。我建议你在你的节点中使用bluebirdpromise,并且不要在auth方法中使用这两个函数做单独的函数或像service这样的最佳实践
    • Promise.js 库怎么样?我已经检查过蓝鸟它有一些兼容性问题。
    • bluebird 是成熟稳定的包,适用于大部分生产环境
    • @SHAHRUKHSHAHID 如果您了解一种现象或想法,请选择并投票赞成一个答案,因此它应该被关闭
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 2018-04-24
    • 2013-07-26
    • 2023-03-11
    • 2020-12-16
    • 2017-02-28
    相关资源
    最近更新 更多