我正在 NestJS 中编写 API,其中有一组通用标头。我决定使用拦截器将标头附加到传出请求中。标头不会附加到请求中,因此请求不断失败。
拦截器
import * as utils from '../utils/utils';
import {
CallHandler,
ExecutionContext,
Injectable,
NestInterceptor
} from '@nestjs/common';
import { HEADERS } from '../middlewares/headers.constant';
import { Observable } from 'rxjs';
import { Request } from 'express';
import { DATA_PARTITION_ID } from '../app.constants';
@Injectable()
export class HeadersInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<void> {
const ctx = context.switchToHttp();
const request: Request = ctx.getRequest();
this.setHeaders(request);
return next.handle();
}
private setHeaders(request): void {
this.updateHeaders(request, HEADERS.ACCEPT, 'application/json');
this.updateHeaders(request, HEADERS.CONTENT_TYPE, 'application/json'); …Run Code Online (Sandbox Code Playgroud) 我正在尝试在拦截器中设置响应标头,但我发现的任何方法都没有运气。我试过了:
const request = context.switchToHttp().getRequest();
const response = context.switchToHttp().getResponse();
<snippet of code from below>
return next.handle();
Run Code Online (Sandbox Code Playgroud)
request.res.headers['my-header'] = 'xyz'response.header('my-header', 'xyz')response.headers['my-header'] = 'xyz'response.header['my-header'] = 'xyz'没有运气。第一个选项表示 res 未定义,第二个选项表示“无法读取未定义的属性‘Symbol(fastify.reply.headers)’”,其他选项则不执行任何操作。
我希望能够使用完整的 url、标题等记录每个 axios 请求,但目前没有找到这样做的方法。
到目前为止,我所做的就是根据这个答案写出一个 Http Interceptor
export class HttpLoggerInterceptor implements NestInterceptor {
intercept(
context: ExecutionContext,
call$: Observable<any>,
): Observable<any> {
return call$.pipe(
map(data => {
// pipe call to add / modify header(s) after remote method
const req = context.switchToHttp().getRequest();
return data;
}),
);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我在调试时浏览对象req和context道具,但看不到 Asios 请求 url 等。除非我错过了。
我的控制器路由(api/data在那种情况下)有 N 个 http 外部调用发生,但拦截器只拦截控制器控制器调用而不是 Axios 调用。
有什么想法吗?
那是context对象:
args:Array(2) [IncomingMessage, ServerResponse]
constructorRef:class AppController { … }
getRequest:() …Run Code Online (Sandbox Code Playgroud) nestjs ×3
node.js ×2
typescript ×2
axios ×1
express ×1
fastify ×1
header ×1
interceptor ×1
javascript ×1