能否在apollo-server中创建REST API处理POST原始数据请求?
Apollo Server 挂载REST API实现方案
完全可以实现,Apollo Server 是基于Node.js HTTP服务封装的,不管你用的是Express、Koa等哪款底层框架,都可以直接在现有服务上挂载REST路由,无需改动已有的GraphQL、Nexus、Prisma逻辑,也不需要额外启动独立服务。
最常用的Express集成方案(绝大多数apollo-server-nexus项目采用该架构)
如果你当前使用的是apollo-server-express包,直接在Express实例上注册目标路由即可,示例代码如下:
const express = require('express'); const { ApolloServer } = require('apollo-server-express'); const { schema } = require('./nexus-schema'); // 替换为你现有Nexus生成的GraphQL schema路径 const prisma = require('./prisma-client'); // 替换为你现有Prisma实例路径 const app = express(); // 配置请求体解析中间件,根据你接收的原始数据类型选择: // 接收JSON格式数据用这个 app.use(express.json()); // 接收任意格式的原始二进制/文本数据用这个,可按需调整大小限制 app.use(express.raw({ type: '*/*', limit: '10mb' })); // 注册你需要的POST路由 app.post('/api/data/status', async (req, res) => { try { // req.body即为请求携带的原始数据 const requestRawData = req.body; // 可直接调用Prisma处理数据,用法和GraphQL resolver中完全一致 // 示例:await prisma.statusLog.create({ data: requestRawData }) res.status(200).json({ success: true, message: '数据处理完成' }) } catch (error) { res.status(500).json({ success: false, message: error.message }) } }) // 原有Apollo Server启动逻辑保持不变 async function initServer() { const apolloServer = new ApolloServer({ schema, context: () => ({ prisma }) // 你原有context配置不需要改动 }) await apolloServer.start() apolloServer.applyMiddleware({ app }) app.listen(4000, () => { console.log(`GraphQL服务运行在 http://localhost:4000${apolloServer.graphqlPath}`) console.log('REST接口 /api/data/status 已生效') }) } initServer()
注意事项
- 路由注册代码要放在
apolloServer.applyMiddleware之前,避免Apollo的全局中间件拦截REST请求 - 如果使用Apollo Server V4版本,搭配
@as-integrations/express集成时逻辑完全一致,直接在Express实例上注册路由即可 - 如果底层用的是Koa等其他框架,逻辑相同,直接在对应框架实例上注册目标路由即可,无需改动Apollo配置
内容的提问来源于stack exchange,提问作者Donghyun Tony Park
相关产品推荐
相关产品推荐

