【发布时间】: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
}
}
}
- 我在创建新用户时遇到的错误
【问题讨论】:
标签: javascript reactjs graphql apollo-client apollo-server