Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graphql 无缝迁移到Postgraphile(多个客户端实例)_Graphql_React Apollo_Apollo Client_Postgraphql - Fatal编程技术网

Graphql 无缝迁移到Postgraphile(多个客户端实例)

Graphql 无缝迁移到Postgraphile(多个客户端实例),graphql,react-apollo,apollo-client,postgraphql,Graphql,React Apollo,Apollo Client,Postgraphql,Postgraphile似乎是一个非常方便的工具,但我已经在客户端和服务器端进行了数十次查询和修改 有没有办法一件一件地集成Postgraphile,让我的GraphQL模式由手工描述 所以,现在我有以下初始化代码: 函数createApolloLink(){ 返回createHttpLink({ uri:“/graphql”, 凭据:“相同来源” }); } 函数create(){ 返回新客户端({ 链接:createApolloLink(), ssrMode:!process.browse

Postgraphile似乎是一个非常方便的工具,但我已经在客户端和服务器端进行了数十次查询和修改

有没有办法一件一件地集成Postgraphile,让我的GraphQL模式由手工描述

所以,现在我有以下初始化代码:

函数createApolloLink(){
返回createHttpLink({
uri:“/graphql”,
凭据:“相同来源”
});
}
函数create(){
返回新客户端({
链接:createApolloLink(),
ssrMode:!process.browser,//eslint禁用行
缓存:新的InMemoryCache(),
connectToDevTools:process.browser
});

}
通常,您的GraphQL客户端不必考虑这一点-它应该在服务器端处理

您可以使用多种技术在服务器端解决此问题:

模式拼接 模式拼接是解决您的问题的一种直接方法-使用您的旧模式并将其与您的PostGraphile模式合并;这样,当客户机与
/graphql
通信时,他们可以访问这两种模式。然后,您可以将旧模式中的所有内容标记为已弃用,并逐渐淘汰使用。但是,如果可以的话,我建议您使用PostGraphile插件

PostGraphile插件 PostGraphile是围绕一个插件系统构建的,您可以使用类似于
makeExtendSchemaPlugin
的东西将旧的GraphQL模式混合到PostGraphile模式中。本文对此进行了说明:但是如果您的旧类型/解析器是通过
graphql工具
之类的工具实现的,那么这可能是最简单的入门方法:

const{makeExtendSchemaPlugin,gql}=require('graphile-utils');
常量typeDefs=gql`\
键入OldType1{
字段1:Int!
字段2:字符串
}
扩展类型查询{
oldField1:OldType1
oldField2:OldType2
}
`;
常量解析程序={
查询:{
oldField1(/*…*/){
/*老逻辑*/
},
//...
},
};
const AddOldSchemaPlugin=makeExtendSchemaPlugin(
构建=>({
typeDefs,
解析器,
})
);
module.exports=AddOldSchemaPlugin;
这也将带来最佳性能,因为不应增加延迟,并且您可以再次将遗留字段/变体标记为不推荐

模式委托 使用这种方法,您可以编写自己的新GraphQL模式,然后将其“委托”到其他GraphQL模式(遗留模式和PostGraphile生成的模式)。这增加了一点延迟,但让您对GraphQL模式的最终形状有了更多的控制,尽管这项功能带来了巨大的责任——如果您输入了错误,那么您将不得不在很长一段时间内保持该错误!就个人而言,我更喜欢PostGraphile使用的生成模式方法


但是,为了回答您的问题,Apollo Link具有“上下文”功能,允许您更改查询的执行方式。通常,这用于添加标题,但也可以使用它覆盖URI以确定查询的位置。我自己从来没有这样做过,但是如果有一个Apollo链接,您可以使用它根据客户机指令甚至字段名自动切换,我也不会感到惊讶


通常,您的GraphQL客户端不必考虑这一点-它应该在服务器端处理

您可以使用多种技术在服务器端解决此问题:

模式拼接 模式拼接是解决您的问题的一种直接方法-使用您的旧模式并将其与您的PostGraphile模式合并;这样,当客户机与
/graphql
通信时,他们可以访问这两种模式。然后,您可以将旧模式中的所有内容标记为已弃用,并逐渐淘汰使用。但是,如果可以的话,我建议您使用PostGraphile插件

PostGraphile插件 PostGraphile是围绕一个插件系统构建的,您可以使用类似于
makeExtendSchemaPlugin
的东西将旧的GraphQL模式混合到PostGraphile模式中。本文对此进行了说明:但是如果您的旧类型/解析器是通过
graphql工具
之类的工具实现的,那么这可能是最简单的入门方法:

const{makeExtendSchemaPlugin,gql}=require('graphile-utils');
常量typeDefs=gql`\
键入OldType1{
字段1:Int!
字段2:字符串
}
扩展类型查询{
oldField1:OldType1
oldField2:OldType2
}
`;
常量解析程序={
查询:{
oldField1(/*…*/){
/*老逻辑*/
},
//...
},
};
const AddOldSchemaPlugin=makeExtendSchemaPlugin(
构建=>({
typeDefs,
解析器,
})
);
module.exports=AddOldSchemaPlugin;
这也将带来最佳性能,因为不应增加延迟,并且您可以再次将遗留字段/变体标记为不推荐

模式委托 使用这种方法,您可以编写自己的新GraphQL模式,然后将其“委托”到其他GraphQL模式(遗留模式和PostGraphile生成的模式)。这增加了一点延迟,但让您对GraphQL模式的最终形状有了更多的控制,尽管这项功能带来了巨大的责任——如果您输入了错误,那么您将不得不在很长一段时间内保持该错误!就个人而言,我更喜欢PostGraphile使用的生成模式方法


但是,为了回答您的问题,Apollo Link具有“上下文”功能,允许您更改查询的执行方式。通常,这用于添加标题,但也可以使用它覆盖URI以确定查询的位置。我自己从来没有这样做过,但是如果有一个Apollo链接,您可以使用它根据客户机指令甚至字段名自动切换,我也不会感到惊讶