如何在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) => 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的主要内容,如果未能解决你的问题,请参考以下文章