【问题标题】:Strange async behavior in Node with Mongoose and promises带有 Mongoose 和 Promise 的 Node 中奇怪的异步行为
【发布时间】:2016-01-12 09:18:30
【问题描述】:

所以我使用 Node.js + Mongoose + Lie 作为 Promise 库。代码如下:

var User = require('../models/user'),
    Promise = require('lie'),
    jwt = require('jsonwebtoken'),
    config = require('../../config');

module.exports = function(express) {
    var router = express.Router();

    router.post('/', function(req, res) {
        if (!req.body.username) return res.json({ success: false, reason: 'Username not supplied.' });
        if (!req.body.password) return res.json({ success: false, reason: 'Password not supplied.' });

        var findUser = new Promise(function(resolve, reject) {
            User.findOne({ username: req.body.username }, function(err, user) {
                if (err) reject (err);
                if (!user) reject({ success: false, reason: 'User not found or password is incorrect.' });
                if (!user.validPassword(req.body.password)) reject({ success: false, reason: 'User not found or password is incorrect.' });
                resolve(user);
            });
        });

        var sendToken = function(user) {
            var token = jwt.sign({ username: user.username }, config.secret, { expiresIn: 2 * 60 * 60 });
            res.json({ success: true, token: token });
        };

        findUser.then(function(value) {
            sendToken(value);
        }).catch(function(reason) {
            res.send(reason);
        });

    return router;
};

所以基本上它是一个身份验证路由,如果一切正常,它会发送一个签名的jwt奇怪的行为是,如果我发送了错误的用户名,服务器会抛出一个错误说

TypeError: Cannot read property 'validPassword' of null

所以说user === null在达到密码有效性检查的时候,但是,在这个有效性检查之前,有一个用户被找到的检查,主要是

if (!user) reject({ success: false, reason: 'User not found or password is incorrect.' });

这里服务器已经知道user === null,因此它应该用success: false拒绝这个promise,并且这段代码应该被扔到catch部分,但它不会发生。

有什么想法吗?

我应该补充一点,如果我将 if (!user.validPassword... 部分更改为 else if 而不是 if,它会正常工作。但是我不明白为什么在 promise 被拒绝后仍然执行任何代码。

编辑

在学习节点的时候,我主要使用了MEAN Machine book,这对我很有帮助,他们使用的语法是这样的:

if (!user) {
    //
} else if (user) {
    //
}

但我想它也应该按我的方式工作。

【问题讨论】:

    标签: javascript node.js mongoose promise


    【解决方案1】:

    您没有停止在reject 上执行您的函数,因此如果findOne 导致空结果validPassword 仍会被调用。

    可能需要加return

     User.findOne({ username: req.body.username }, function(err, user) {
       if (err)
         return reject (err);
       if (!user)
         return reject({ success: false, reason: 'User not found or password is incorrect.' });
       if (!user.validPassword(req.body.password))
         return reject({ success: false, reason: 'User not found or password is incorrect.' });
       resolve(user);
     });
    

    或者使用else if:

     User.findOne({ username: req.body.username }, function(err, user) {
       if (err) { 
         reject (err);
       } else if (!user) {
         reject({ success: false, reason: 'User not found or password is incorrect.' });
       } else if (!user.validPassword(req.body.password))
         reject({ success: false, reason: 'User not found or password is incorrect.' });
       } else {
         resolve(user);
       }
     });
    

    【讨论】:

    • 有道理.. 我想我只是认为暗示resolvereject 应该停止执行:D 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2015-12-29
    • 1970-01-01
    相关资源
    最近更新 更多