Postgraphile看起来非常方便,但是我已经在客户端和服务器端有了几十个查询和突变。
有什么方法可以将Postgraphile一片片地集成在一起,让我的旧GraphQL模式被手动描述呢?
所以,现在我有了以下初始化代码:
function createApolloLink(){
return createHttpLink({
uri: '/graphql',
credentials: 'same-origin'
});
}
function create(){
return new ApolloClient({
link: createApolloLink(),
ssrMode: !process.browser, // eslint-disable-line
cache: new InMemoryCache(),
connectToDevTools: process.browser
});
}
如何利用一个标准化存储(客户端)并连接到第二个API点,由Postgraphile驱动,例如/graphql2
发布于 2018-10-22 09:24:25
通常,您的GraphQL客户机不需要考虑这个问题--它应该在服务器端处理。
在服务器端,您可以使用许多技术来解决这个问题:
模式拼接
模式拼接是解决问题的一种直截了当的方法--将旧模式与PostGraphile模式合并;这样,当客户端与/graphql通信时,他们可以访问两个模式。然后,您可以将旧模式中的所有内容标记为废弃的,并逐步淘汰使用。但是,如果可以的话,我建议您使用PostGraphile插件.
PostGraphile插件
PostGraphile是围绕一个插件系统构建的,您可以使用类似makeExtendSchemaPlugin的东西将旧的GraphQL模式混合到PostGraphile模式中。这里记录了这一点:https://www.graphile.org/postgraphile/make-extend-schema-plugin/,但是如果您的旧类型/解析器是通过类似于graphql-tools的工具实现的,那么这可能是最简单的入门方式:
const { makeExtendSchemaPlugin, gql } = require('graphile-utils');
const typeDefs = gql`\
type OldType1 {
field1: Int!
field2: String
}
extend type Query {
oldField1: OldType1
oldField2: OldType2
}
`;
const resolvers = {
Query: {
oldField1(/*...*/) {
/* old logic here */
},
//...
},
};
const AddOldSchemaPlugin = makeExtendSchemaPlugin(
build => ({
typeDefs,
resolvers,
})
);
module.exports = AddOldSchemaPlugin;这也将导致最好的性能,因为不应该增加延迟,您可以再次将遗留字段/突变标记为不推荐的。
模式委托
使用这种方法,您可以编写自己的新GraphQL模式,然后将其“委托”给其他GraphQL模式(遗留模式,以及由PostGraphile生成的模式)。这增加了一些延迟,但使您对GraphQL模式的最终形状有了更多的控制,尽管这种功能带来了很大的责任--如果您做了一个错误,那么您将不得不在很长一段时间内维护这个错误!就我个人而言,我更喜欢PostGraphile使用的生成模式方法。
但是,要回答您的问题,阿波罗链接具有“上下文”功能,允许您更改查询的执行方式。通常,这用于添加标题,但也可以使用它覆盖URI,以确定查询的去处。我自己从来没有这样做过,但如果有一个阿波罗链接,您可以使用它可以根据客户端指令,甚至是字段名自动切换,我也不会感到惊讶。
https://github.com/apollographql/apollo-link/tree/master/packages/apollo-link-http#context
https://stackoverflow.com/questions/52922535
复制相似问题