GraphQL启动报错Syntax Error: Expected ":", found ")"排查求助
错误定位
你遇到的是GraphQL SDL语法错误,报错位置指向typeDefs第53行,也就是Mutation里的addEmployee(Employee): Employee这行:
- GraphQL要求所有字段参数必须遵循
参数名: 类型的格式,你直接将类型名Employee放在参数括号里,缺少参数名和冒号,导致解析器预期读到冒号时直接碰到了右括号,抛出错误。
修复步骤
1. 修改typeDefs.js
首先新增EmployeeInput输入类型(输入参数必须用input而不是type定义),再修正addEmployee的参数定义:
const { gql } = require('apollo-server-express'); // create our typeDefs // TODO timecard formatting? const typeDefs = gql` type Employee { _id: ID firstName: String lastName: String street: String city: String state: String zipcode: Int email: String phone: String timeCards: [Int] } # 新增员工输入类型用于传参 input EmployeeInput { firstName: String! lastName: String! street: String city: String state: String zipcode: Int email: String! phone: String } type Client { _id: ID firstName: String lastName: String street: String city: String state: String zipcode: Int email: String phone: String workOrders: [WorkOrder] } type WorkOrder { _id: ID date: String description: String notes: [String] parts: [String] invoice: String timeClocks: [Int] } type Warehouse { parts: [String] laborItems: [String] } type Query { me: Employee employees(_id: ID): [Employee] employee(_id: ID!): Employee clients: [Client] client(_id: ID!): Client } type Mutation { # 修正参数写法:参数名+冒号+输入类型 addEmployee(input: EmployeeInput!): Employee } `; // export the typeDefs module.exports = typeDefs;
2. 修改resolvers.js的addEmployee方法
补充返回语句,否则创建员工后查询会返回空值:
const { Client, Employee } = require('../models'); const resolvers = { Query: { // get all clients clients: async () => { return Client.find() .populate("workOrders"); }, // get single client client: async (parent, { _id }) => { return Client.findOne({ _id }) //.populate("workOrders"); }, // get all employees employees: async () => { return Employee.find() .populate("timeCards"); }, // get single employee employee: async(parent, { _id }) => { return Employee.findOne({ _id }) .populate("timeCards"); } }, Mutation: { addEmployee: async (parent, { input }) => { const employee = await Employee.create(input); // 补充返回创建好的员工对象 return employee; } } }; module.exports = resolvers;
内容的提问来源于stack exchange,提问作者Shawnlittrel
相关产品推荐
相关产品推荐

