GraphQL 对突变的速率限制
Posted
技术标签:
【中文标题】GraphQL 对突变的速率限制【英文标题】:GraphQL rate limit on mutations 【发布时间】:2021-11-28 10:35:37 【问题描述】:我正在尝试在创建新用户时对 GraphQL Mutation 实施速率限制。我在 Queries 中成功实现了它,但在 Mutations 上无法做到这一点,任何关于我如何解决这个问题的建议或资源将不胜感激。
提前致谢。
解析器/用户中的导入const bcrypt = require('bcrypt');
const UserInputError = require('apollo-server');
const getGraphQLRateLimiter = require('graphql-rate-limit')
const validateCreateInput = require('../../util/validators');
const User = require('../../models/User');
限速器声明
const rateLimiter = getGraphQLRateLimiter( identifyContext: (ctx) => ctx.id );
具有速率限制的查询效果很好
Query:
getUsers: async (parent, args, context, info) =>
try
const errorMessage = await rateLimiter(
parent, args, context, info ,
max: 1, window: '3s'
);
if (errorMessage) throw new Error(errorMessage);
const users = await User.find().sort( createdAt: -1 );
return users;
catch (err)
throw new Error(err);
,
,
我的问题出现在 Mutation 尝试创建具有速率限制的用户时
Mutation:
async createUser(_,
createInput:
name,
email,
role,
password,
confirmPassword
)
/****** problem here ******/
const errorMessage = await rateLimiter(
parent, args, context, info ,
max: 1, window: '3s'
);
if (errorMessage) throw new Error(errorMessage);
/****** problem here ******/
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
我在创建新用户时遇到的错误
【问题讨论】:
【参考方案1】:错误很明显,请检查您的查询解析器和突变解析器之间的区别。你需要这样的东西:
Mutation:
async createUser(parent, args, context, info) ...
然后将定义父字段和其他必填字段。
【讨论】:
这不会让我访问 createInput 字段,并打印此错误"message": "Cannot read property 'createInput' of undefined"
以上是关于GraphQL 对突变的速率限制的主要内容,如果未能解决你的问题,请参考以下文章