GraphQL创建用户Mutation配置速率限制报错如何解决?
问题根因
你写的createUser Resolver没有声明接收GraphQL默认传入的四个标准参数,导致调用速率限制器时传入的parent、context、info三个变量全是未定义,直接触发运行错误。
标准GraphQL Resolver的参数顺序固定为(parent, args, context, info),你的代码里只处理了前两个参数,且直接解构了args里的createInput,没有保留剩余三个参数的引用。
修复方案
把createUser的参数声明改成标准格式,拿到全部四个参数后再做后续逻辑即可,修改后代码如下:
Mutation: { async createUser(parent, args, context, info) { // 先做速率限制校验 const errorMessage = await rateLimiter( { parent, args, context, info }, { max: 1, window: '3s' } ); if (errorMessage) throw new Error(errorMessage); // 再解构入参 const { createInput: { name, email, role, password, confirmPassword } } = args; // 后续原有逻辑不变 const { valid, errors } = validateCreateInput(name, email, role, password, confirmPassword); if (!valid) { throw new UserInputError('Errors', { errors }) } const duplicateEmail = await User.findOne({ email }); if (duplicateEmail) { throw new UserInputError('Email is already used', { errors: { email: 'Email is already used' } }) } password = await bcrypt.hash(password, 12); const newUser = new User({ name, email, role, password, createdAt: new Date().toISOString() }) const res = await newUser.save(); return { ...res._doc, id: res._id } } }
校验说明
修改完成后可以先测试3秒内连续调用两次createUser Mutation,确认会触发速率限制报错,且正常调用不会再出现参数未定义的问题即可。
内容的提问来源于stack exchange,提问作者felmez
相关产品推荐
相关产品推荐

