首页 > 解决方案 > 可以使用 protobuf 发布到 Apollo 服务器吗?

问题描述

我正在开发一个当前使用 protobuf 从客户端与 api 进行通信的项目。我想做一个显示通过graphql进行通信的概念证明,并且想知道是否可以将protobuf发送到apollo服务器而不是json。

还询问了阿波罗服务器的频谱: https ://spectrum.chat/apollo/apollo-server/is-there-support-in-the-road-map-at-all-for-sending-protobuf-from-the-客户端~dbdbc639-d7c7-4d0f-9caa-b58bb3744a90

我看到一些protobuf相关的包, https ://www.npmjs.com/package/apollo-engine-reporting-protobuf https://www.npmjs.com/package/@apollo/protobufjs

并且想知道是否有任何计划或是否有可能。在这里问是因为我在社区网站上没有收到任何回复。

标签: graphqlprotocol-buffersapolloapollo-serverprotobuf.js

解决方案


如果可以使用apollo-server-express,只要在服务器上再次将 protobuf 转换为 json 就可以实现,我想这可以通过 protobuf.js 实现。

apollo-serverapollo-server-express期望请求正文中有三个密钥对值

  1. 操作名称

  2. 变量

  3. 询问

这就是请求正文的样子(使用 morgan-body 记录) 在此处输入图像描述

如果您正在使用apollo-server-express,您可以使用您的自定义express middleware,您可以在其中将 protobuf 反序列化为 json 并将 json 添加到req.bodyApollo Server。

从更改apollo-serverapollo-server-express只需几个步骤,并且您的阿波罗服务器配置没有变化

// import it from apollo-server-express instead of apollo-server
const { ApolloServer } = require('apollo-server-express');
const express = require('express');
const app = express();

app.use((req, res, next) => {
    // Intercept the request before it reaches the Apollo Server
    // Use protobuf.js to deserialize the request body into json
    // Add the json to req.body
    // Call the next() to go to next middleware
    next();
});

const server = new ApolloServer({/* Your apollo server config */})

server.applyMiddleware({ app });
app.listen({ port: 4000 }, () => console.log(` Server ready at http://localhost:4000${server.graphqlPath}`));

推荐阅读