如何在nestjs中设置morgan-body

Posted

技术标签:

【中文标题】如何在nestjs中设置morgan-body【英文标题】:how to setup morgan-boddy in nestjs 【发布时间】:2021-10-22 02:50:12 【问题描述】:

我想将morgan-boddy 设置为中间件来记录请求和响应。

所以我创建了一个这样的函数:

export function RequestLogging(app) 
  const logger = new Logger('Request');
  app.use(
    morganBody(app, 
      stream:  // <--- error is here "Void function return value is used "
        write: (message) => logger.log(message.replace('\n', '')),
      ,
    ),
  );

我调用 main.ts

// main.ts

async function bootstrap() 
    const app = await NestFactory.create(AppModule);
    useRequestLogging(app);
    // ...

但它似乎不起作用。我在stream: 线上遇到了错误'Void function return value is used'

知道如何解决吗?

更新:

我试图走不同的道路,实际上只是按照文档将 morganBody 插入 main.ts:

  import bodyParser from 'body-parser';
  import morganBody from 'morgan-body';

  app.use(bodyParser.json());

  // hook morganBody to express app
  morganBody(app); <-- getting error here "TS2345: Argument of type 'INestApplication' is not assignable to parameter of type 'Application'."

我希望有一个适当的文档如何在 nestjs 中处理。

【问题讨论】:

这不起作用怎么办?你只是没有得到日志吗?你的应用程序有错误吗? “不起作用”并不能告诉我们太多信息,并且使调试和找出问题变得更加困难 @JayMcDoniel 添加了错误详情 如果你这样做write: (message) =&gt; this.logger.log(message.replace('\n'. '')); 会怎样? @JayMcDoniel 也不能这样工作 【参考方案1】:

这是一个非常有趣的中间件。它最终需要 express 实例本身,因为它在后台调用 app.use(morgan)app.response.send()。我真的会研究其他解决方案,而不是以这种方式访问​​响应的东西。

无论哪种方式:这个设置都有效

import  Logger  from '@nestjs/common';
import  NestFactory  from '@nestjs/core';
import * as morgan from 'morgan-body';

import  AppModule  from './app.module';

async function bootstrap() 
  const app = await NestFactory.create(AppModule);
  const logger = app.get(Logger);
  (morgan as any)(app.getHttpAdapter().getInstance(), 
    stream: 
      write: (message: string) => 
        logger.log(message.replace('\n', ''));
        return true;
      ,
    ,
  );
  await app.listen(3033);

bootstrap();

包的类型也是错误的,它不是默认导出,而是命名的,所以import morgan from 'morgan-body' 不像宣传的那样工作(至少对我来说不是)。

return true 是必需的,因为 write 需要一个 stream.writable() 方法,该方法返回一个布尔值。您可以将其默认为 true。然后您必须使用app.getHttpAdapter().getInstance() 以确保将 express 实例传递给中间件。再次,不稳定的设置,但它的工作原理。

【讨论】:

不。 Nest 已经为 JSON 和 urlencoded 附加了 body-parser 您提到您会考虑其他解决方案,因为morgan-body 以某种方式接受响应,为什么会这样,您还有什么可以推荐的吗?可能有一个我错过的类似于这个的nestjs原生http记录器吗?我没能找到更好的。还有一个叫morgan,但它有点受限,因为它不记录正文。这是它与nestjs ref ***.com/a/65406470/415078 集成的方式,在我看来,它与依赖express app 有类似的问题 至少在morgan 中,您可以直接应用中间件。通常,我不会记录 HTTP 请求的主体,因为这可能意味着记录密码和其他安全信息,这意味着您的日志现在需要加密,并且只有某些人可以“信任”它们。我是ogma 的作者,它有一个拦截器,可以用最少的配置记录 HTTP、GQL、WS 和 RPC 请求,所以这就是我使用的。 是的,我就是你的意思。但是我注意到morgan-body 中有一个功能可以帮助隐藏关键信息参考:github.com/sirrodgepodge/morgan-body/pull/27。无论如何感谢您的帮助。 刚试过 ogma,效果很好,但是我想知道是否可以记录正文参考:***.com/questions/68920628/…

以上是关于如何在nestjs中设置morgan-body的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NestJS 中设置参数?

如何在 NestJS 中设置仅 HTTP cookie

如何在nestjs中设置更多“jwt”AuthGuard?

如何在@nestjs/mongoose 模式中设置枚举

我如何在 NESTJS 中设置多租户

如何在 NestJS 中设置类似 Angular 的配置环境文件?