【问题标题】:How to log JSON HTTP Responses using Winston/Morgan如何使用 Winston/Morgan 记录 JSON HTTP 响应
【发布时间】:2015-09-26 13:42:57
【问题描述】:

我将 Winston 和 Morgan 用于 Sails.js 中的所有后端日志记录,并且我需要能够记录来自 HTTP 获取请求的响应。我需要将它们记录在一个文件中。我的 logFile 当前显示所有 http 请求,但不显示响应。我已经搜索了 Morgan 和 Winston 的所有选项,但找不到这样做的方法/选项。我只是想知道你们中是否有人对如何做到这一点有任何建议? 谢谢!

【问题讨论】:

    标签: json node.js express sails.js winston


    【解决方案1】:

    您可以为 ExpressJS 编写一个中间件函数,该函数将在发送响应后记录正文。以 Node 的 http module 为基础,了解 Connect(以及 Express)如何管理响应主体(这是一个流):您可以挂钩写入该流的两种方法以获取块,然后连接/解码它们记录它。简单的解决方案,可以变得更健壮,但它表明这个概念是有效的。

    function bodyLog(req, res, next) {
      var write = res.write;
      var end = res.end;
      var chunks = [];
    
      res.write = function newWrite(chunk) {
        chunks.push(chunk);
    
        write.apply(res, arguments);
      };
    
      res.end = function newEnd(chunk) {
        if (chunk) { chunks.push(chunk); }
    
        end.apply(res, arguments);
      };
    
      res.once('finish', function logIt() {
        var body = Buffer.concat(chunks).toString('utf8');
    
        // LOG BODY
      });
    
      next();
    }
    

    然后在主应用路由器中分配任何路由之前设置它:

    app.use(bodyLog);
    // assign routes
    

    我假设您也可以将其用作 Morgan 中变量的赋值,但我还没有研究异步变量赋值的工作原理。

    【讨论】:

    • 在 res.write 行出现打字稿错误 -------> 类型 '(chunk: any) => void' 不可分配给类型 '{ (chunk: any, cb?: (错误:错误)=> void):布尔值; (chunk: any, encoding: BufferEncoding, cb?: (error: Error) => void): boolean; }'。类型 'void' 不能分配给类型 'boolean'。
    猜你喜欢
    • 2019-11-12
    • 2015-03-10
    • 2019-06-12
    • 2015-09-17
    • 2019-11-16
    • 2018-10-07
    • 2019-07-03
    • 2018-06-25
    • 1970-01-01
    相关资源
    最近更新 更多