You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:27:33