在 Node.js/Express 中记录所有请求

新手上路,请多包涵

在我的小型 node.js 应用程序中,使用 express,我想记录所有传入的请求,所以我最终得到了这个:

 var bodyParser = require('body-parser');

module.exports = function(app) {
   app.set("port", 50001);
   app.set("json spaces", 2);
   app.use(bodyParser.json());
   app.use(function (error, req, res, next) {
      app.logger.info("received from "+req.get("X-Forwarded-For")+" : "+req.method+" "+req.originalUrl+" (Authorization: "+req.get("Authorization")+")");
      //does not work if json is malformed
      //app.logger.info("content :"+JSON.stringify(req.body));
      if (error /*instanceof SyntaxError*/) {
         res.status(400);
         app.logger.error(error);
         res.json({ error:{msg: error.message}});
      } else {
         next();
      }
   });
   app.use(app.auth.initialize());
};

不幸的是,当出现错误(在我的情况下,正文中的 JSON 字符串格式不正确)时,我只能通过 app.logger.info 行获取日志。我在这里想念什么?

原文由 Julien 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 471
1 个回答

Expressjs 根据你给它的回调类型来调整它的功能(这在 JS 库中并不常见,所以人们对此感到困惑并不奇怪)。

如果您在回调有四个参数的情况下执行此操作:

 app.use(function(error, req, res, next) {...});

然后 Express 假定这是一个仅出错的中间件处理程序,并且只会在出现错误时调用。在 express 文档 中,请参阅标有 错误处理中间件 的部分。请注意该页面的这个特定部分:

以与其他中间件函数相同的方式定义错误处理中间件函数,除了使用四个参数而不是三个参数,特别是使用签名 (err, req, res, next)):

而且,这里有一整节专门介绍 错误处理中间件 的文档。

如果您只使用三个参数:

 app.use(function(req, res, next) {...});

然后,它是一个正常的中间件,在没有错误时调用。我不确定他们是否提供了一种同时获得两者的方法。但是,当然,作为一种解决方法,您可以将日志记录代码放入一个函数中,然后从两个独立的中间件处理程序调用该函数,一个用于错误,一个用于非错误。

原文由 jfriend00 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题