猫鼬试图使用Promise处理保存前的错误

时间:2018-12-05 17:59:46

标签: javascript node.js mongodb mongoose

我正在尝试使用预保存来处理用户或电子邮件存在错误,但是我无法使其正常工作。如果我注释掉了我的预保存块,那么一切都可以正常工作,但是如果重复,它将返回默认的猫鼬错误,因为我的模式使用唯一。

我想检查用户名和电子邮件的唯一性,并发送一条包含true或false的消息,以便我可以在前端同时处理这两个消息。 (顺便说一下,这是一个Express Restful API)

有人知道怎么做吗?

这是我当前的设置:

当请求通过所有中间件等时,我的注册方法在我的注册后路由上调用。ValidateRegisterForm对数据进行一些验证,如果一切正常,则哈希密码并将所有数据传递给createUser,否则它将发送错误。

public register(req, res){
   validateRegisterForm(req.body).then(data => {
    createUser(data).then(() => {
      res.send({status: 201});
    }).catch(err => {
      res.send(err);
    })
  }).catch(err => {
      res.send(err);
    });
}

我的createUser方法:

export const createUser = (data) => {
  return new Promise( async (resolve, reject) => {
     const userData = JSON.parse(data);
     const newUser = new User(userData);
     await newUser.save()
       .then(() => resolve())
       .catch(err => reject(err))
  });
};

还有带有预保存的用户模式:

userSchema.pre('save', () => {
  return new Promise((resolve, reject) => {
    const userExists =  !! this.findOne('username');
    const emailExists = !! this.findOne('email');
    if (userExists || emailExists){
      const err = JSON.stringify({inUse : {mail: emailExists, usr: userExists}});
      reject(err)
    }
    resolve();
  })
});

2 个答案:

答案 0 :(得分:0)

我找到了解决方案,显然预保存不支持箭头功能。现在,一切都像魅力。对我来说,这是了解findOne的工作原理并了解与之相关的问题的原因。

我能够使用this.get('value')

相对于当前文档评估数据库
 userSchema.pre('save',  function (){
  return new Promise(async (resolve, reject) => {
    const userExists =  await User.findOne({username : this.get('username')})
      .then(doc => {return doc ?  true :  false })
      .catch(err => reject(err));
    const emailExists =  await User.findOne({email : this.get('email')})
      .then(doc => {return doc ?  true :  false })
      .catch(err => reject(err));
    if (userExists || emailExists){
      const err = JSON.stringify({inUse : {mail: emailExists, usr: userExists}});
      reject(err)
    } else {
      resolve();
    }
  })
});

答案 1 :(得分:0)

如果要使用预保存,则无法使用箭头(=>)函数。

您需要按照如下所示的旧式方式进行操作。

userSchema.pre('save', function () {
   your code goes here....
})