Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在发送Nest.js之前格式化响应?_Javascript_Typescript_Nestjs - Fatal编程技术网

Javascript 如何在发送Nest.js之前格式化响应?

Javascript 如何在发送Nest.js之前格式化响应?,javascript,typescript,nestjs,Javascript,Typescript,Nestjs,我遵循文档,并能够为响应映射添加拦截器 我希望为响应提供一致的json格式输出 我如何使用拦截器或其他比这种方法更好的方法来实现这一点 { "statusCode": 201, "message": "Custom Dynamic Message" "data": { // properties meta: {} } } transform.interceptor.ts import { Injectable, NestInterceptor,

我遵循文档,并能够为响应映射添加拦截器

我希望为响应提供一致的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,
        })),
      );
  }
}
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 };
      }
}

如果我理解您对控制器响应和整个拦截器响应所做的事情,那么您可以做类似的事情:

导入{
可注射,
内斯特拦截器,
执行上下文,
CallHandler,
}来自“@nestjs/common”;
从“rxjs”导入{Observable};
从“rxjs/operators”导入{map};
导出接口响应{
状态码:编号;
消息:字符串;
资料:T;
}
@可注射()
导出类拦截器
实现嵌套拦截器{
拦截(
上下文:ExecutionContext,
下一个:CallHandler,
):可见{
下一个返回
.handle()
.烟斗(
地图((数据)=>({
statusCode:context.switchToHttp().getResponse().statusCode,
message:data.message
数据:{
结果:data.result,
meta:{}//如果这应该是实际返回,那么用data.result替换{}
}
})),
);
}
}
并使控制器返回为
{message:'Custom message',result}


另一个需要更多前期工作但可能允许更干净的代码的选项是创建一个自定义装饰器,该装饰器从类和方法中反映一个值(消息),然后在注入反射器后在拦截器中检索该值,但同样,这将需要更多的前期工作来设置。

你说的是什么“比这种方法更好"? “拦截器的方法有什么你不喜欢的吗?”正如我前面所说的。如何在json响应中添加带有自定义消息的消息键?我的意思是如何使用拦截器方法实现我想要的结果。如果我们不能用拦截器实现我想要的,那么还有其他的方法吗?谢谢,这是可行的,但是你能告诉我更多关于我们在这里使用的map函数吗。因为之前我试图做一些类似于您的答案的事情,但我无法调试或打印映射函数中的迭代器“数据”。即使我把断点放在那里,它也表示未定义。你能帮我调试一下吗?
map
。这样做的目的是获取从
next.handle()
返回的可观察值,这意味着从控制器返回的值(Nest自动生成一个可观察值,因此您不必担心),然后它应该获取
数据
,并使用返回json的箭头函数将其相应地映射到我们的新格式。如果您想
console.log(data)
您需要将它从立即返回json改为使用单词
return
,并且只使用
{}
,而不是
({})