这个 GraphQL 查询我做错了啥?

Posted

技术标签:

【中文标题】这个 GraphQL 查询我做错了啥?【英文标题】:What am I doing wrong with this GraphQL query?这个 GraphQL 查询我做错了什么? 【发布时间】:2017-12-26 21:27:48 【问题描述】:

我是 GraphQL 的新手,我正在尝试进行突变以从我的数据库中删除一篇文章,但我不知道如何操作。我正在使用 Node.js、Mongoose 和 GraphQL。

这是我的架构上的突变。

const Mutation = new GraphQLObjectType(
  name: 'Mutation',
  description: 'Articles Mutations',
  fields: () => (
    remove: 
      type: articleType,
      description: 'Deletes an article by id',
      args: 
        id: 
          type: new GraphQLNonNull(GraphQLString)
        
      ,
      resolve: (value, id) => 
        return db.Article.findOneAndRemove(_id: new ObjectId(id));
      
    
  )
);

这是我在调用 API 删除文章时使用的查询。

export const DELETE_ARTICLE_QUERY = (id) => (`
  remove(id: "$id") 
    id
    author
    content
    published
    tags
    title
    excerpt
  
`);

我做错了什么?

我收到 400 错误请求错误。消息:“无法查询类型“突变”的字段“删除”。”

【问题讨论】:

在提出这样的问题时,提供尽可能多的详细信息会很有帮助。例如:当您运行查询时,GraphQL 或节点是否抛出任何错误,以及错误的含义。 【参考方案1】:

发出 GraphQL 请求时,最好始终指定您正在执行的操作类型(查询或突变)。如果您不这样做,GraphQL 会假定您正在进行查询,但这里不是这种情况。您没有具体说明您是否看到任何错误,但我敢打赌 GraphQL 会返回类似 cannot query field remove on Query 的内容。

修改 DELETE_ARTICLE_QUERY 以包含操作:

export const DELETE_ARTICLE_QUERY = (id) => (`mutation 

包含用于调试目的的操作名称是一种很好的做法,因此您也可以说:

export const DELETE_ARTICLE_QUERY = (id) => (`mutation DeleteArticle 

编辑:根据您提供的错误,听起来架构对象设置不正确。它应该看起来像这样:

const schema = new GraphQLSchema(
  query: new GraphQLObjectType(
    name: "WhateverNameYouWantForQuery",
    fields: 
      // each query is a property here
    
  ),
  mutation: new GraphQLObjectType(
    name: "WhateverNameYouWantForMutation",
    fields: 
      // each mutation is a property here
    
  ),
);

如果您将您的突变定义为一个单独的变量 (Mutation),您将辅助突变属性的值作为该变量:

const schema = new GraphQLSchema(
  query: new GraphQLObjectType(
    // query props
  ),
  mutation: Mutation
  ),
);

这是一个可以开箱即用的工作示例。启动服务器后,您可以在浏览器中转到 http://localhost:3000/graphql 以访问 GraphiQL 界面并在那里尝试潜在的查询/突变。

const graphqlHTTP = require('express-graphql');
const app = require('express')();
const 
  GraphQLSchema,
  GraphQLObjectType,
  GraphQLNonNull,
  GraphQLString,
  GraphQLList
 = require('graphql');

const articleType = new GraphQLObjectType(
  name: 'Article',
  fields: 
    title: 
      type: GraphQLString,
    ,
  ,
);

const Mutation = new GraphQLObjectType(
  name: "RootMutationnnnn",
  fields: () => (
    remove: 
      type: articleType,
      args: 
        id: 
          type: new GraphQLNonNull(GraphQLString)
        
      ,
      resolve: (value, id) => 
        return title: 'Testing a delete';
      
    
  )
);

const schema = new GraphQLSchema(
  query: new GraphQLObjectType(
    name: "RootQueryyyyy",
    fields: 
      articles: 
        type: new GraphQLList(articleType),
        resolve: () => 
          return [title: 'Test title', title: 'Test title'];
        
      
    
  ),
  mutation: Mutation
);

const root = ;

app.post('/graphql', graphqlHTTP(
  schema,
  rootValue: root,
  graphiql: false,
));

app.get('/graphql', graphqlHTTP(
  schema,
  rootValue: root,
  graphiql: true,
));

app.listen(3000, function()
  console.log('listening on port 3000');
);

【讨论】:

感谢您的评论和真正有用的上衣。但是我仍然收到 400 Bad Request 错误:(

以上是关于这个 GraphQL 查询我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用`setVariables`后中继生成无效查询-我做错了啥吗?

AngularJS POST 与 $resource 在查询字符串中发送,我做错了啥?

这个Lua代码我做错了啥

这个简单的模板类我做错了啥?

这个 AFNetworking JSON 帖子我做错了啥?

在这个非常基本的 UIScrollView 中我做错了啥