为什么用承诺进行mongoose查询总是转到.then块而不是.catch

时间:2017-05-20 20:35:18

标签: node.js mongoose promise

我的用户集合有一个用户并且处于非活动状态但是当我查询找出存在且活动的用户时,我正在使用带有promise的mongoose 4.x(参见下面的查询),它总是转到{{1阻止并显示空白数组但在我的理解中,它必须转到.catch()阻止。

请更正我并建议如何撰写正确的查询。

架构

let userSchema = new Schema({
    username: {type: String, required: true, unique: true},
    password: {type: String, required: true},
    firstName: {type: String, required: true},
    lastName: {type: String},
    email: {type: String, required: true},
    gender: {type: String, enum: ['M','F'], default: 'M'},
    passwordReset: {type: Boolean, default: false},
    isActive: {type: Boolean, default: false},
    createdOn: {type: Date, default: Date.now}
});

查询

User
            .find()
            .and([{username: req.body.username}, {isActive: true}])
            .exec()
            .then( (user) => {
                    console.log('user found', user );
                    // match saved and input password
                    if (user.password === req.body.password) {
                        res.status(200).json(user);
                    } else {
                        console.log('else part', user);
                        res.status(404).send({
                            "message": "invalid credentials."
                        });
                    }
                }).catch( (err) => {
                    console.log('catch error', err);
                    res.status(404).send(err);
                });
        }

1 个答案:

答案 0 :(得分:1)

有效查询没有产生任何结果时,这不是错误,因此不会引发任何错误。错误仅针对实际错误条件抛出,例如无效查询,连接问题等。

处理此问题的正确方法是检查查询是否产生了结果:

User.findOne({ username: req.body.username, isActive: true }).then(user => {
  if (! user) {
    return res.status(404).send({ message: "user not found." });
  }
  ...
}).catch(err => {
  console.log('catch error', err);
  res.status(500).send(err);
});