我正在创建一个使用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()
2条答案
按热度按时间pxiryf3j1#
guard本身写得正确,但它被放在一个位置,导入它会在文件之间产生循环引用,所以当使用
@UseGuards()
时,它会变成@UseGuards(undefined)
,这会导致隐含的错误消息。将guard移到一个专用文件将修复该错误nwo49xxi2#
我按照你的github参考设置,它不工作,下面是我的代码,我的设置哪里是错误的,和对ws的请求没有被拦截(在handleRequest方法)