【问题标题】:Mongoose handle validation error in a promise call and Express middlewareMongoose 在 Promise 调用和 Express 中间件中处理验证错误
【发布时间】:2018-04-01 13:05:38
【问题描述】:

我正在尝试重构基于 Express 的简单 API 代码以使用承诺而不是回调。我唯一的挑战是处理 Mongoose 验证错误(如果用户存在的示例测试)并将这个错误扔到中间件中。

我正在通过 index.js 上的中间件处理错误:

// Error handling middleware
app.use(function(err, req, res, next){
  res.status(422).send({error: err._message})
});

这段代码成功地处理了所有边缘情况,除了existingUser部分,错误被遗忘并且在响应中不可见:

router.post('/signup', function(req, res, next) {
  const email = req.body.email;
  const password = req.body.password;

  // Custom error
  if (!email || !password) {
    return res.status(422).send({ error: 'You must provide email and password'});
  }

  User.findOne({ email: email })
  .then(function(existingUser) {
    // If a user with email does exist, return an error
    if (existingUser) {
      // return res.status(422).send({ error: 'Email is in use' });
      throw new Error('User already exists!');
    }

    // If a user with email does NOT exist, create and save user record
    const user = new User({
      email: email,
      password: password
    });

    // save to database
    return user.save()
  })
  .then(function(user) {
    // Respond to request indicating the user was created
    res.json({ token: tokenForUser(user) });
  })
  .catch(next);

注意我注释掉了这段代码,因为它会抛出错误“发送后无法设置标头”:

return res.status(422).send({ error: 'Email is in use' });

我的问题是:

  1. 我处理自定义验证错误(例如测试电子邮件或密码字段是否为空白)的方式是否正确,或者有更好的方法,因为我没有通过错误中间件传递这些错误?
  2. 如何处理 Promise 中的错误?

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    您可以在新的 Promise 中测试用户名和密码:

    Promise.resolve().then(()=> {
      if (!email || !password) {
        throw new Error('You must provide email and password');
      }
      return User.findOne({ email: email })
    })
    

    在then 函数中抛出错误将停止执行并调用附加到承诺的第一个catch。在您的情况下,next 回调作为第一个参数是 trowed 错误。 Imo,你做得很好,应该在正确的中间件中适当地表达应用程序发送客户端错误。

    【讨论】:

    • 为了澄清第二个问题,我需要验证“ if(existingUser) ”部分。
    • 我已经更新了我的回复,我希望能回答你的问题;)
    猜你喜欢
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2016-08-18
    • 2020-07-13
    • 1970-01-01
    • 2013-02-07
    相关资源
    最近更新 更多