nest.js_06nest.js-middleware间件的使用,配置logger写入请求参数日志
nest.js 中间件的使用 log 场景
logger middleware
新建 logger 中间件
nest g middleware logger middleware
logger 中间件内容
middleware/logger.middleware.ts
import { Injectable, NestMiddleware } from "@nestjs/common";
import { Logger } from "../common/log4js/index";
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: any, res: any, next: () => void) {
// 拼接需要写入的内容
const logFormat = `{method: ${req.method}, requestOriginalUrl: ${
req.originalUrl
}, query:${JSON.stringify(req.query)}, params:${JSON.stringify(
req.params
)}, ip: ${req.ip}, statusCode: ${res.statusCode} }`;
next();
Logger.access(JSON.stringify(logFormat));
//这里就记录所有请求的参数而已,当然,也可以在这里判断 res.statusCode 写入不同类型的日志,看项目需要,只是展示可以这么做
//如果你希望对不同的路由有不同的处理,可以另写一个,绑定到特定的路由。
}
}
使用中间件
- main.ts 中直接全局引用
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";
import { HttpExceptionFilter } from "./common/filters/http-exception.filter";
import { LoggerMiddleware } from "./middleware/logger.middleware";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
// 全局基础URL,届时所有路由前都会有这个基础的url
app.setGlobalPrefix(AppModule.bsUrl);
// 全局注册错误的过滤器
app.useGlobalFilters(new HttpExceptionFilter());
// 全局日志中间件
app.use(new LoggerMiddleware().use);
await app.listen(AppModule.port, () => {
console.log(`http://localhost:${AppModule.port}/${AppModule.bsUrl}`);
});
}
bootstrap();
- app.module.ts 模块中给 UserController 使用
apply 中用逗号隔开可以使用多个中间件
forRoutes 可接受一个字符串、多个字符串、对象、一个控制器类甚至多个控制器类
如下,如果你不想导入太多的 controller,可以使用逗号隔开的路由字符串
consumer.apply(LoggerMiddleware).forRoutes(“user”);
这是等效的
// other import
import { MiddlewareConsumer, Module } from "@nestjs/common";
import { LoggerMiddleware } from "./middleware/logger.middleware";
import { UserController } from "./logical/user/user.controller";
@Module({
//other
})
export class AppModule {
//other
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes(UserController);
}
}
排除使用中间件(因为没有使用到,直接搬运了官方例子)
有时我们想从应用中间件中排除某些路由。我们可以使用 exclude() 方法轻松排除某些路由。
此方法可以采用一个字符串,多个字符串或一个 RouteInfo 对象来标识要排除的路由,官方实例:
consumer
.apply(LoggerMiddleware)
.exclude(
{ path: "cats", method: RequestMethod.GET },
{ path: "cats", method: RequestMethod.POST },
"cats/(.*)"
)
.forRoutes(CatsController);
此外函数式中间件也是类似的,只是函数写法不同,当中间件没有任何依赖关系时,我们可以考虑使用函数式中间件
总结
可见,nest.js 中使用中间件,只需要简单的声明一个中间件,可以得到 req, res, next 供使用。此次将请求参数写入了日志
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhiaejck
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22