无法查询类型查询的字段注册

AFM*_*les 0 node.js express graphql express-graphql

开始摆弄 GraphQL,但我遇到了这个错误。不确定这是架构定义还是查询中的问题。

const express_graphql = require('express-graphql')
const { buildSchema } = require('graphql')
const users = require('../users/translator')

const schema = buildSchema(`
    type User {
        id: ID
        email: String
        role: String
    }
    type Query {
        user(id: ID!): User
        users: [User]
        token(email: String!, password: String!): String!
    }
    type Mutation {
        signup(email: String!, password: String!, role: String!): ID
    }`
)

const resolvers = {
    users: users.getAll,
    user: users.getById,
    token: users.login,
    signup: users.create,
}

module.exports = app => {
    // GraphQL route
    app.use('/graphql', express_graphql({
        schema,
        rootValue: resolvers,
        graphiql: true,
    }))
}
Run Code Online (Sandbox Code Playgroud)

app是一个express.js服务器,同时const users保留逻辑。我能够获取用户和令牌,但是当我尝试发布突变时

{
    signup(email: "my@email.com", password: "321321", role: "admin")
}
Run Code Online (Sandbox Code Playgroud)

我得到了错误Cannot query field "signup" on type "Query"。从服务器读取架构后查看 GraphiQL 建议,看起来注册突变甚至没有导出:

图式铰链

一些教程说我应该使用导出解析器

const resolvers = {
    query: {
        users: users.getAll,
        user: users.getById,
        token: users.login,
    },
    mutation: {
        signup: users.create,
    }
}
Run Code Online (Sandbox Code Playgroud)

但它也不起作用。有什么提示吗?

Dan*_*den 5

您需要指定操作类型(querymutationsubscription),如下所示:

mutation {
  signup(email: "my@email.com", password: "321321", role: "admin")
}
Run Code Online (Sandbox Code Playgroud)

如果省略操作类型,则假定该操作是查询。这称为“查询简写表示法”,但仅在您的操作未命名且不包含任何变量定义时才有效。

不管怎样,最好始终包含操作类型。