使用ES5导出GraphQL Schema及搭建Express-GraphQL服务的技术问询
基于ES5搭建Express + Apollo GraphQL服务器并导出Schema
我来帮你把代码补全,同时讲清楚ES5环境下导出GraphQL Schema的正确方式:
1. 完善你的server.js代码
你原来的代码里graphqlExpress的配置没写完,而且app.listen的位置也需要调整(要在挂载所有中间件之后启动服务器),完整的ES5版本代码如下:
const express = require('express'); const cors = require('cors'); const bodyParser = require('body-parser'); const { graphqlExpress, graphiqlExpress } = require('apollo-server-express'); const schemaTest = require('./schemas/schema'); const app = express(); // 启用CORS(解决前端跨域问题,根据你的需求可选) app.use(cors()); // 挂载GraphQL接口:解析请求体后,传入我们定义的Schema app.use('/graphql', bodyParser.json(), graphqlExpress({ schema: schemaTest })); // 挂载GraphiQL调试界面(开发环境用,方便直接写查询测试) app.use('/graphiql', graphiqlExpress({ endpointURL: '/graphql' // 指定GraphQL的接口地址 })); // 启动服务器 app.listen(4000, () => { console.log('Server listening on http://localhost:4000'); console.log('GraphiQL debug interface: http://localhost:4000/graphiql'); });
2. ES5方式导出GraphQL Schema
ES5不支持ES6的export default语法,所以我们用module.exports来导出Schema。下面分两种常用的Schema定义方式:
方式一:用buildSchema(适合简单场景)
如果你用graphql包的buildSchema来定义Schema,./schemas/schema.js的写法如下:
const { buildSchema } = require('graphql'); // 用SDL字符串定义你的Schema结构 const schema = buildSchema(` type Query { hello: String getUser(id: ID!): User } type User { id: ID! name: String email: String } `); // 定义解析器函数(处理每个字段的返回逻辑) const rootResolver = { hello: () => 'Hello World from GraphQL!', getUser: (args) => { // 这里可以替换成实际的数据库查询逻辑 return { id: args.id, name: 'Sample User', email: 'user@example.com' }; } }; // 导出schema和解析器(注意:如果用这种方式,server.js里的graphqlExpress需要加上rootValue配置) // 如果你想只导出schema,也可以单独导出,但解析器需要在server.js里传入 module.exports = { schema: schema, rootResolver: rootResolver }; // 对应的server.js里的graphqlExpress要改成: // graphqlExpress({ // schema: schemaTest.schema, // rootValue: schemaTest.rootResolver // })
方式二:用makeExecutableSchema(Apollo推荐,支持复杂场景)
这是Apollo官方推荐的方式,把类型定义和解析器分开管理,更适合复杂项目:
const { makeExecutableSchema } = require('apollo-server-express'); // 定义类型SDL(Schema Definition Language) const typeDefs = ` type Query { hello: String getUser(id: ID!): User } type User { id: ID! name: String email: String } `; // 定义解析器对象(ES5的对象字面量写法) const resolvers = { Query: { hello: () => 'Hello from Apollo GraphQL!', getUser: (parent, args) => { // 模拟数据库查询,实际项目里可以替换为数据库操作 return { id: args.id, name: 'Mohamed Taboubi', email: 'mohamed@example.com' }; } } }; // 生成可执行的Schema const executableSchema = makeExecutableSchema({ typeDefs, resolvers }); // ES5导出:用module.exports把Schema导出给server.js使用 module.exports = executableSchema;
最后注意事项
- 先确保安装所有依赖:
npm install express cors body-parser apollo-server-express graphql - 开发时可以用
nodemon自动重启服务器:npm install -g nodemon,然后运行nodemon server.js - 访问
http://localhost:4000/graphiql可以打开调试界面,直接编写GraphQL查询测试接口
内容的提问来源于stack exchange,提问作者Mohamed Taboubi
相关产品推荐
相关产品推荐

