【发布时间】:2021-10-12 16:44:48
【问题描述】:
我找不到将变量从中间件传递到 Nest.js 中的结构的明确方法。我正在我的AuthMiddleware 中验证 JWT,我想让控制器可以访问此令牌。
下面只是我的中间件的摘录,以提供代码示例。我想让 token 在我的控制器中访问。
import { Request, Response, NextFunction } from 'express';
// other imports
@Injectable()
export class AuthMiddleware implements NestMiddleware {
async use(req: Request, res: Response, next: NextFunction) {
const authHeader = req.header('authorization');
if (!authHeader) {
throw new HttpException('No auth token', HttpStatus.UNAUTHORIZED);
}
const bearerToken: string[] = authHeader.split(' ');
const token: string = bearerToken[1];
res.locals.token = token;
}
}
我已经尝试通过更改 res.locals 变量来使令牌可访问,但响应对象在我的控制器中仍然是空的。
这是我想要访问中间件令牌的控制器:
@Controller('did')
export default class DidController {
constructor(private readonly didService: DidService) {}
@Get('verify')
async verifyDid(@Response() res): Promise<string> {
console.log(res)
// {}
return res;
}
【问题讨论】:
-
您是否尝试附加在
req而不是res? -
试图将它附加到身体上但没有用
-
我也不能将它附加到
req对象上,因为 express 中的Request类型没有那个键。 -
您可以,但您必须编写自己的接口/类型来扩展
Request类型。顺便说一句,我刚刚测试了req.locals = 123,它按预期工作。确保您的中间件在verifyDid方法之前运行 -
是的,只要将 req 定义为 any 就可以了
标签: typescript express nestjs