【问题标题】:GraphQL rate limit on mutationsGraphQL 对突变的速率限制
【发布时间】: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


    【解决方案1】:

    错误很明显,请检查您的查询解析器和突变解析器之间的区别。你需要这样的东西:

    Mutation: {
      async createUser(parent, args, context, info) { ... }
    }
    

    然后将定义父字段和其他必填字段。

    【讨论】:

    • 这不会让我访问 createInput 字段,并打印此错误"message": "Cannot read property 'createInput' of undefined"
    猜你喜欢
    • 1970-01-01
    • 2022-10-23
    • 2018-06-10
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多