javascript - 我使用 Express 中间件收到 UnhandledPromiseRejection

标签 javascript node.js mongodb express middleware

我尝试在尝试访问 addContact 端点之前检查用户是否已登录。

var isLoggedIn = (req, res, next) => {
   if(req.session.user)
       next();

   //unauthorized
   res.status(401).send('Please log in.');
};

发布路由 addContact 如下所示,我使用 isLoggedIn 中间件来检查用户在添加之前是否登录。

app.post('/addContact', isLoggedIn, (req, res) => {

   //if Mongo database is not started
   if(mongoose.connection.readyState !== 1) {
       res.send(`We're sorry. We are having trouble connecting. Try again later`);
       return;
   }

   var contact = new Contact({
       _userId: req.session.user.id,
       name: req.body.name,
       phone_number: req.body.phone_number,
       email: req.body.email
   });

   console.log('adding contact from session', req.session.user);

   contact.save().then((c) => {
       res.send(`${contact.name} was added succesfully.`);
   }).catch((e) => {
       res.send(e);
   });

});

“从 session 中添加联系人:”正在使用正确的 session ID req.session.user 记录到控制台。但是,一旦它尝试 save() 新联系人,我就会收到以下错误

UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Cannot set headers after they are sent to the client

发送的响应显示“请登录”,这是在中间件 isLoggedIn 中指定的。

有人可以告诉我为什么会发生这种情况吗?我试图不重复问题,但找不到解决方案。谢谢

最佳答案

您需要在调用 next返回:

var isLoggedIn = (req, res, next) => {
   if(req.session.user) {
       next();
       return;
    }

   //unauthorized
   res.status(401).send('Please log in.');
};

实际上更好的是:

var isLoggedIn = (req, res, next) => {
   if (!req.session.user) {
       const err = new Error('Please login')
       err.status = 401
       throw err
    }

   next()
};

然后有实际的错误处理程序中间件:

/**
 * Show useful information to client in development.
 */
exports.development = (err, req, res, next) => {
  err.stack = err.stack || ''
  const status = err.status || 500

  res.status(status).json({
    status,
    error
  })
}

/**
 * Do not show errors in production.
 */
exports.production = (err, req, res, next) => {
  if (err.stack) {
    delete err.stack
  }

  err.message = err.messsage || 'oops'
  err.status = err.status || 500

  res.status(err.status).json({
    status: err.status,
    error: {
      message: err.message
    }
  })
}

关于javascript - 我使用 Express 中间件收到 UnhandledPromiseRejection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48431815/

相关文章:

node.js - LokiJS 在处理超过 50k 的读取和写入时与更新和读取不一致

javascript - Node js Express 应用程序提供静态文件

MongoDB:检索集合中的第一个文档

javascript - 无法在 FireFox 中建立与 socket.io 的连接(xhr 轮询错误)

php - 如何在 symfony2 中使用 mongodb Doctrine 选择某些字段

sql - 如何将数据从SQL Server传输到mongodb(使用mongoose schema进行验证)

javascript - 加载脚本时修改 div 高度

javascript - 如何使用 polymer 元件

javascript - 如何通过浏览器在html按钮上运行excel应用程序

javascript - 将 FormData 嵌套对象与文件一起附加