从同一服务器使用Apollo客户端访问Postgraphile(作为库)



我有postgraphile运行在一个快速服务器(作为一个库)

export const postGraphileServer = () => {
return postgraphile(process.env.DB_DSN, 'public', options);
};

表达:

app.use(postGraphileServer());

使用codegen自省插件,我正在生成一个graphql.schema.json,当GQL通过http链接外部访问时,一切正常工作。yml片断:

packages/graphql/src/generated/graphql.schema.json:
plugins:
- 'introspection'

我有一个在express服务器上公开REST端点的用例,它将接受有效负载并在Postgres中创建一行。我想做的是直接访问Postgraphile(没有网络跳转)以避免验证-我相信只使用模式

根据我所读到的,这样做的方法是通过SchemaLink。我试过这样做:

const clientSchema = buildClientSchema(schema as unknown as IntrospectionQuery);
// Make executable schema from client schema
const executableSchema = makeExecutableSchema({
typeDefs: clientSchema,
});
return (this.#_apolloClient = new ApolloClient({ 
ssrMode: true,
link: new SchemaLink({ schema: executableSchema }),
cache: new InMemoryCache(),
}));

其中schemagraphql.schema.json文件生成的代码。我相信我所遇到的问题是,我还需要将解析器传递给makeExecutableSchema,以便Postgraphile知道如何查询/变异-目前它无声地失败,但什么也不做。

我在这里的路径是否正确,是否有一种方法可以访问从postgraphile生成的解析器(或者我需要为这个特定的用例手动创建它们?)

好的,因此在Benjie的帮助下,我能够使用GraphileApolloLink.ts获得此工作。由于此链接从中间件本身获取上下文和模式,因此不需要尝试从schema.graphql.json自省文件构建模式。

我的要求略有不同,所以我删除了GraphileApolloLink.ts中的突变检查。

为了完整起见,我可以用 来初始化ApolloClient
get #apolloClient(): ApolloClient<NormalizedCacheObject> {
if (this.#_apolloClient) {
return this.#_apolloClient;
}
const _link = new GraphileApolloLink({
req: this.request,
res: this.response,
// Getter for the middleware object passed into Express
postgraphileMiddleware: postGraphileMiddleware(),
});
return (this.#_apolloClient = new ApolloClient({
ssrMode: true,
link: _link,
cache: new InMemoryCache(),
}));
}

并使用codegen生成的查询/突变按预期成功查询数据。

相关内容

  • 没有找到相关文章

最新更新