为什么带有承诺的猫鼬查询总是转到 .then 块而不是 .catch



我的用户集合有一个用户,它是非活动的,但是当我查询以找出存在和活动的用户时,我正在使用带有承诺的猫鼬 4.x(见下面的查询(,它总是转到.then块并显示空白数组,但据我了解,它必须转到.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);
                });
        }

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

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

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);
});

最新更新