【问题标题】:Nest.js pass variable from middleware to controllerNest.js 将变量从中间件传递到控制器
【发布时间】: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


【解决方案1】:
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;

    next();  ====> add this to middleware
  }
}

控制器

import { Controller, Get, Response } from '@nestjs/common';


@Controller()
export class AppController {
  constructor() {}


  @Get('verify')
  async verifyDid(@Response() res): Promise<string> {
    console.log(res.locals);
    return res;
  }
}

应用中间件

export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(AuthMiddleware).forRoutes('*');
  }
}

【讨论】:

  • 我仍然更喜欢将令牌附加到 req.locals 而不是正文,因为在某些请求中,我使用整个正文,正文中的令牌会更改请求中的对象跨度>
  • @JonasLevin 我用当地人测试并添加了更新的代码
猜你喜欢
  • 2015-11-20
  • 2017-06-14
  • 1970-01-01
  • 2012-02-10
  • 2016-01-11
  • 2017-05-28
  • 1970-01-01
  • 2015-09-10
相关资源
最近更新 更多