El throttler de Nest js con GraphQL no está funcionando como se esperaba.
@Injectable()
export class GqlThrottlerGuard extends ThrottlerGuard {
getRequestResponse(context: ExecutionContext) {
const gqlCtx = GqlExecutionContext.create(context);
const ctx = gqlCtx.getContext();
return { req: ctx.req, res: ctx.res };
}
}
Aquí estoy obteniendo solo req de ctx, res es undefined. Estoy usando GraphQL con express en nestjs.
Así es como se ve mi objeto de contexto antes de crear un GqlExecutionContext:
ExecutionContextHost {
args: [
undefined,
{ id: 2 },
{ req: [IncomingMessage] },
{
fieldName: 'user',
fieldNodes: [Array],
returnType: User!,
parentType: Query,
path: [Object],
schema: [GraphQLSchema],
fragments: [Object: null prototype] {},
rootValue: undefined,
operation: [Object],
variableValues: {},
cacheControl: [Object]
}
],
constructorRef: [class UsersResolver],
handler: [Function: findOne],
contextType: 'graphql'
}
Error:
[Nest] 30284 - 08/01/2022, 12:54:25 am ERROR [ExceptionsHandler] No se puede leer la propiedad 'ip' de undefined
TypeError: No se puede leer la propiedad 'ip' de undefined
en ThrottlerGuard.getTracker (C:\Users\Mahesh\OneDrive\Desktop\graphql-server\node_modules\@nestjs\throttler\dist\throttler.guard.js:95:16)
davy.ai
En este fragmento de código, la clase
GqlThrottlerGuard
extiende la claseThrottlerGuard
y anula su métodogetRequestResponse
. El propósito de este método es devolver un objeto que contiene las propiedadesreq
yres
del objetocontext
pasado al guardia, que se puede utilizar para limitar las solicitudes al servidor.Sin embargo, en este caso particular, el objeto
ctx
solo contiene una propiedadreq
y la propiedadres
esundefined
. Esto se debe a que el objeto de contexto se crea utilizandoGqlExecutionContext.create
, que se utiliza específicamente para solicitudes de GraphQL en NestJS.En GraphQL, no hay un objeto de respuesta directa como en una API REST tradicional. En su lugar, los datos de respuesta se envían de vuelta al cliente como parte de la respuesta de GraphQL. Por lo tanto, el objeto
res
no está disponible en el objeto de contexto de GraphQL.Esto puede ser problemático cuando se extienden clases como
ThrottlerGuard
que esperan tener acceso tanto a las propiedadesreq
comores
del objeto de contexto. En este caso, la claseThrottlerGuard
intenta acceder a la propiedadip
del objetoreq
, lo que causa unTypeError
ya quectx.req
esundefined
.Para solucionar este problema, es posible que deba modificar la clase
ThrottlerGuard
para que funcione con solicitudes de GraphQL. Una posible solución es modificar el métodogetTracker
deThrottlerGuard
para acceder a la dirección IP del cliente directamente desde el objeto de contexto de GraphQL:Este fragmento de código utiliza la propiedad
request.connection.remoteAddress
para extraer la dirección IP del cliente del objeto de contexto de GraphQL. Después de realizar este cambio, la claseThrottlerGuard
debería poder rastrear y limitar correctamente las solicitudes de GraphQL en NestJS.