ThrottlerGuard无法在Nestjs中的WebSocket上运行

iqxoj9l9  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(197)

我正在创建一个使用Nestjs和websockets的应用程序,但现在我需要在套接字上添加速率限制,但分析文档文档链接并实现其中所述内容时,当我使用@ UseGuard(MyGuard)时,应用程序中出现错误。
我的护卫:

@Injectable()
export class NewThrottlerGuard extends ThrottlerGuard {
  protected async handleRequest(
    context: ExecutionContext,
    limit: number,
    ttl: number,
  ): Promise<boolean> {
    console.log('Request');
    const client = context.switchToWs().getClient();
    const ip = client.conn.remoteAddress;
    const key = this.generateKey(context, ip);
    const ttls = await this.storageService.getRecord(key);

    if (ttls.length >= limit) {
      throw new ThrottlerException();
    }

    await this.storageService.addRecord(key, ttl);
    return true;
  }
}

WebSocket:

@UseGuards(NewThrottlerGuard)
@SubscribeMessage('sendMessage')
sendMessage(
  @ConnectedSocket() client: Socket,
  @MessageBody() message: string,
) {
  client.rooms.forEach((room) => {
    if (room !== client.id) {
      client.broadcast.to(room).emit('message', message);
    }
  });
}

控制台出错:

/node_modules/@nestjs/common/utils/validate-each.util.js:22
    throw new InvalidDecoratorItemException(decorator, item, context.name);
          ^
Error: Invalid guard passed to @UseGuards() decorator (ChatGateway).
at validateEach

文件位于:这是一个很好的例子。

function validateEach(context, arr, predicate, decorator, item) {
    if (!context || !context.name) {
        return true;
    }
    console.log(context, arr)
    const errors = arr.some(str => !predicate(str));
    if (errors) {
        throw new InvalidDecoratorItemException(decorator, item, context.name);
    }
    return true;
}

我把一些console.log然后在终端显示:

[Function: ChatGateway] [ undefined ]

在Github Throttler文档中,他们说:由于Nest绑定全局防护的方式,您无法将防护与APP_GUARD或app.useGlobalGuards()绑定。因此,我使用@UseGuards()

pxiryf3j

pxiryf3j1#

guard本身写得正确,但它被放在一个位置,导入它会在文件之间产生循环引用,所以当使用@UseGuards()时,它会变成@UseGuards(undefined),这会导致隐含的错误消息。将guard移到一个专用文件将修复该错误

nwo49xxi

nwo49xxi2#

我按照你的github参考设置,它不工作,下面是我的代码,我的设置哪里是错误的,和对ws的请求没有被拦截(在handleRequest方法)

相关问题