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 对突变的速率限制的主要内容,如果未能解决你的问题,请参考以下文章

如何对 express-graphql 突变进行单元测试?

Appsync 客户端对 GraphQL 突变的 Angular 订阅

如何在 GraphQL 中执行突变?

Graphql 的登录突变未找到用户

具有自定义标量类型的 GraphQL.js 突变

GraphQL 突变中的 onError