【发布时间】:2020-05-28 02:23:58
【问题描述】:
我按照文档进行操作,并能够为响应映射添加拦截器。
我想要一个一致的 json 格式的响应输出。
如何使用拦截器或其他比这种方法更好的方法来实现这一点。
{
"statusCode": 201,
"message": "Custom Dynamic Message"
"data": {
// properties
meta: {}
}
}
transform.interceptor.ts
import {
Injectable,
NestInterceptor,
ExecutionContext,
CallHandler,
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
export interface Response<T> {
statusCode: number;
data: T;
}
@Injectable()
export class TransformInterceptor<T>
implements NestInterceptor<T, Response<T>> {
intercept(
context: ExecutionContext,
next: CallHandler,
): Observable<Response<T>> {
return next
.handle()
.pipe(
map((data) => ({
statusCode: context.switchToHttp().getResponse().statusCode,
data,
})),
);
}
}
app.controller.ts
export class AppController {
@Post('login')
@UseGuards(AuthGuard('local'))
@ApiOperation({ summary: 'Login user' })
@ApiBody({ type: LoginDto })
@ApiOkResponse({ content: { 'application/json': {} } })
@UseInterceptors(TransformInterceptor)
async login(@Request() req) {
const result = await this.authService.login(req.user);
return { message: 'Thank you!', result };
}
}
【问题讨论】:
-
“比这种方法更好”是什么意思?拦截器方法有什么你不喜欢的地方吗?
-
@JayMcDoniel 正如我之前所说。如何在 json 响应中添加带有自定义消息的消息键?我的意思是如何使用拦截器方法实现我想要的结果。如果我们无法使用拦截器实现我想要的,那么还有其他方法吗?
标签: javascript typescript nestjs