承诺呼叫和Express中间件中的Mongoose句柄validation错误

我正试图重构一个基于Express的简单的API代码来使用promise而不是callback。 我唯一的挑战是处理Mongoosevalidation错误(例如,如果用户存在的话就是testing),并把这个错误引入中间件。

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

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

这是成功处理除了现有用户部分以外的所有边缘情况的代码片段,其中错误被遗忘且在响应中不可见:

 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. 是我处理自定义validation错误的方式(如testing电子邮件或密码字段为空)是否正确,或者有更好的方法,因为我没有通过错误中间件传递这些错误?
  2. 如何处理承诺中的错误?

您可以在新的承诺中testing用户名和密码:

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

在函数内部抛出一个错误会停止执行,并调用附加到promise的第一个catch 。 在你的情况下,第next参数的nextcallbacktrowed错误。 Imo,你做得很好,在正确的中间件中正确expression应用程序发送客户端错误。