【问题标题】:Will affect on performance the creating new schema at every functional call?在每次功能调用时创建新模式会影响性能吗?
【发布时间】:2021-02-18 06:02:15
【问题描述】:

根据我的要求,我必须在每次函数调用时创建新的schema

这确实有效,但我担心它的性能。

我的代码:

   app.post('/',  (req, res)=> {

      const {query, data} = req.body;

      doOperations(data, 'multiValueSearch', docs => {
        
            const RootQueryType = GraphQLObjectType({
                name: "RootQuery",
                fields: {   
                    users: {
                        type: GraphQLList(UserType),
                        resolve: ()=> docs
                    }
                }
    
            });
        
            const schema = new GraphQLSchema({
                query: RootQueryType
            });
       
            graphql(schema, query).then(result => res.json(result)));
        
       });

   });

doOperations功能在用户搜索好友时随时可用。 所以在每次搜索中都会调用这个doOperations

这是一个问题还是不关心是否会影响 graphql 性能?

为什么我必须这样做?因为 docs 返回基于 data 我传递给 db。

【问题讨论】:

  • query 来自哪里? callback 来自哪里? doOperations 是如何定义的(它有什么作用)?所有这些代码(doOperations() 调用)在哪里?看起来很奇怪 - 通常操作是在模式的解析器函数中完成的。
  • @Bergi,查询来自使用req.body.query 的客户端,我在app.get('/', (req, res) => {doOperations()}) 内调用doOperations
  • ... 或者如何使用?为什么?显示/描述上下文......看起来很奇怪......没有graphql服务器的graphql响应?
  • @xadm,我刚刚发布了我的一部分代码,以避免在这里出现我们不需要的内容。我只需要知道这种方式是坏方法还是好方法。
  • @Muhammad 除此之外,您还有其他 graphql 端点吗?您的架构真的只有一个顶级字段吗?

标签: javascript node.js mongodb graphql graphql-js


【解决方案1】:

为什么我必须这样做?因为文档是根据我传递给 db 的数据返回的。

不,这不是在每次调用时都创建新架构的理由。

您应该创建一个使用解析器的静态架构,该解析器从 rootvalue 中获取 docs,可以通过每个 graphql 查询 execute()ion 传递。


在您的情况下,您实际上甚至不需要它。而不是为整个端点运行doOperations,您应该在产生用户的解析器中运行它并将data作为参数:

const RootQueryType = GraphQLObjectType({
    name: "RootQuery",
    fields: {   
        users: {
            type: GraphQLList(UserType),
            args: {
                filter: {
                    type: GraphQLList(ConditionType),
                },
            },
            resolve(_, {filter}) {
                return doOperations(filter, 'multiValueSearch');
            }
        }
    }

});

const schema = new GraphQLSchema({
    query: RootQueryType
});


app.post('/',  (req, res)=> {
    const {query, variables} = req.body;
    graphql(schema, query, null, {}, variables).then(result => {
        res.json(result);
    }, err => {
        console.error(err);
        res.status(500).json({error: 'A problem occurred.'});
    });
});

【讨论】:

  • 请再次检查,因为我已经添加了一些代码片段,可能会更有意义
  • 数据是一个数组,我将它传递给mongodb进行过滤
  • @Muhammad 什么数组?
  • 对象数组
  • data传递给nodejs的mongodb驱动的users.find({$or: data}).toArray( (err, docs))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多