我有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(),
}));
其中schema
为graphql.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生成的查询/突变按预期成功查询数据。