我们有一个现有的私有GraphQL服务器,它为我们的React应用程序提供支持,并希望将这些功能的子集公开为REST端点.这样我们就不必支持2个代码库,一个用于GraphQL,一个用于REST API.
我做了一些研究,发现可以使用很好的工具来获取现有的REST端点并创建一个包装器/代理层来将REST API公开为GraphQL服务器.
我想知道是否有人知道一个工具将反向...采取现有的GraphQL服务器并代理一些架构作为休息端点?
谢谢,G
(编辑:有人最终建立了一个库来完成我在下面描述的内容!在这里试试:https://www.npmjs.com/package/rest-graphql)
我认为最好的方法是不从模式中的类型生成API,而是将特定查询公开为端点.这样,您可以返回要发送给客户端的确切数据形状.最好的部分是,GraphQL已经拥有您需要的所有工具,包括处理参数!
例如,您想要创建一个端点:
/posts/1
假设你希望它映射到这个查询:
const postByIdQuery = ` query postById($postId: Int!) { post(id: $postId) { title description author { name } } } `;
然后在您的服务器端REST API库(例如express)中,您可以执行以下操作:
app.get('/posts/:postId', function (req, res) { graphql( schema, // same schema as your graphql api postByIDQuery, // the query from above rootValue, context, // set these same way as for your graphql endpoint req.params // use the route params as variables! ).then((result) => { res.send(result); }).catch((error) => { // something to handle errors });; })
如果你想创建很多端点,我会创建一个帮助函数,例如:
function addEndpointFromQuery(app, path, query) { // generates endpoint like the above sample }
这里非常巧妙的是你的路由参数(:postId
在这种情况下)只需要与你声明的查询变量($postId
)匹配,然后它们可以自动连接在一起!然后你可以简单地调用你的帮助函数来执行上述操作:
addEndpointFromQuery(app, '/posts/:postId', ` query postById($postId: Int!) { post(id: $postId) { title description author { name } } } `);
如果您愿意,还可以添加一个额外的参数来转换结果以适合您所需的REST响应格式.
我认为有人可以建立一个库来实现这一点,但感觉它对应用程序来说非常具体,具有特定的响应格式,生成上下文的方式等等.所以我个人建议像上面那样编写自己的帮助器,它可能在不到50行代码中完成.