https://github.com/nestjs/nest/issues/173
//创建middleware
import { Injectable, NestMiddleware } from '@nestjs/common';
import { RequestContext } from './RequestContext';
import * as cls from 'cls-hooked';
@Injectable()
export class RequestContextMiddleware implements NestMiddleware {
constructor() {}
use(req, res, next) {
// res.status(200).json({
// abc: 334,
// });
const requestContext = new RequestContext(req, res);
const session =
cls.getNamespace(RequestContext.nsid) || cls.createNamespace(RequestContext.nsid);
session.run(async () => {
session.set(RequestContext.name, requestContext);
next();
});
}
// use() {
// return (req, res, next) => {
// console.log('执行----------');
// var requestContext = new RequestContext(req, res);
// Zone.current
// .fork({
// name: RequestContext.name,
// properties: {
// [RequestContext.name]: requestContext,
// },
// })
// .fork(Zone['longStackTraceZoneSpec'])
// .run(async () => {
// await next();
// });
// };
// next();
// };
// }
}
//注册middleware
export class AppModule {
// configure(consumer: MiddlewareConsumer) {
// consumer.apply(RequestContextMiddleware).forRoutes('*');
// }
configure(consumer: MiddlewareConsumer) {
consumer.apply(RequestContextMiddleware).forRoutes('bff');
}
}
//current context
import 'zone.js';
import 'zone.js/dist/zone-node.js';
import 'zone.js/dist/long-stack-trace-zone.js';
import { HttpException, HttpStatus } from '@nestjs/common';
import { IncomingMessage } from 'http';
import * as cls from 'cls-hooked';
import { CurrentUser } from './CurrentUser';
export class RequestContext {
public static nsid = 'some_random_guid';
public readonly id: Number;
public request: IncomingMessage;
public response: any;
constructor(request: IncomingMessage, response: any) {
this.id = Math.random();
this.request = request;
this.response = response;
}
public static currentRequestContext(): RequestContext {
const session = cls.getNamespace(RequestContext.nsid);
if (session && session.active) {
return session.get(RequestContext.name);
}
return null;
}
public static currentResponse(): any {
let requestContext = RequestContext.currentRequestContext();
if (requestContext) {
requestContext.response.status(200);
return requestContext.response;
}
return null;
}
public static currentRequest(): IncomingMessage {
let requestContext = RequestContext.currentRequestContext();
if (requestContext) {
return requestContext.request;
}
return null;
}
public static currentUser(throwError?: boolean): CurrentUser {
let requestContext = RequestContext.currentRequestContext();
if (requestContext) {
const user: any = requestContext.request['user'];
if (user) {
return new CurrentUser(user);
}
}
if (throwError) {
throw new HttpException('Unauthorized', HttpStatus.UNAUTHORIZED);
}
return null;
}
}
//使用
@Post('/currentResponse')
currentResponse(): Promise<any> {
console.log(123);
var r: Response;
RequestContext.currentResponse().status(200).json({
abc: 10000,
});
return Promise.resolve();
}