中继应用程序:如何自省服务器上的模式?

Posted

技术标签:

【中文标题】中继应用程序:如何自省服务器上的模式?【英文标题】:Relay app: How to introspect schema on server? 【发布时间】:2015-11-17 15:43:48 【问题描述】:

我正在玩继电器入门套件。我还使用sangria 创建了一个graphql 服务器。现在我正在尝试将两者连接在一起。

在 relay-starter-kit 中,每次更改架构时,都需要运行脚本来重新生成 schema.json 文件。但由于 graphql 支持模式自省,我想知道是否有办法配置我的中继应用程序以在服务器启动时自省服务器的模式。

有谁知道这是否可行或想出如何做到这一点?

【问题讨论】:

这不就是你运行'npm start'时的样子吗?使用“npm run update-schema”检查生成的模式文件 这不是自省,这是在加载schema.json。我想要的是能够向我的服务器发出一个 graphql 自省查询,这样它就可以拉下那个 JSON,而我不必继续运行 npm run update-schema 或我的服务器的等效项。 【参考方案1】:

定义一个 babelRelayPlugin.js(在验证客户端 graphql 查询时由 webpack 运行):

var babelRelayPlugin   = require('babel-relay-plugin');
var introspectionQuery = require('graphql/utilities').introspectionQuery;
var request            = require('sync-request');

var url = 'http://localhost:3000/graphql';

var response = request('POST', url, 
   qs: 
      query: introspectionQuery
   
);

var schema = JSON.parse(response.body.toString('utf-8'));

module.exports = babelRelayPlugin(schema.data, 
   abortOnError: true,
);

当然,将 url 变量更改为您用于开发的任何服务器 url。 在 webpack 中,在您的 loader 定义中包含以下内容:

query: stage: 0, plugins: ['./babelRelayPlugin']

并指向上面babelRelayPlugin.js文件的位置。

【讨论】:

【参考方案2】:

看起来我们需要这样的东西(来自https://github.com/facebook/relay/blob/master/scripts/jest/updateSchema.js#L25):

import  buildASTSchema, introspectionQuery  from 'graphql/utilities';

var body = fs.readFileSync(inFile, 'utf8');
var ast = parseSchemaIntoAST(body);
var astSchema = buildASTSchema(ast, 'Root', 'Mutation');
graphql(astSchema, introspectionQuery).then(
    function(result) 
      var out = JSON.stringify(result, null, 2);
      fs.writeFileSync(outFile, out);
);

【讨论】:

【参考方案3】:

Babel Relay 插件使用自省产品 (schema.json) 来验证和编译 Relay.QL 表达式。幸运的是,getBabelRelayPlugin 方法接受自省产品或返回自省产品的函数。

然后应该可以在您的应用程序的构建系统(例如 Webpack)中执行类似的操作:

// Pseudocode
var SCHEMA_PATH = 'path/to/schema.js';
var introspectionProduct = introspectSchema(SCHEMA_PATH);

watch(SCHEMA_PATH, () => introspectionProduct = introspectSchema(SCHEMA_PATH));

var babelRelayPlugin = getBabelRelayPlugin(() => introspectionProduct);

【讨论】:

我有一个 GitHub 问题将其纳入入门工具包。如果有人在我开始之前有时间,就在这里! github.com/relayjs/relay-starter-kit/issues/13 这是否支持访问外部服务器? getBabelRelayPlugin() 只接受字符串或同步回调。如果 Babel 允许插件以这种方式运行,它可能会增加它以接受异步回调。 @JoeSavona 可能知道更多。

以上是关于中继应用程序:如何自省服务器上的模式?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何递归地自省 GraphQL 模式?

为中继自动生成 graphql 模式(石墨烯服务器)

“模拟中继”在录音系统上的应用

Apollo GraphQL 客户端查询返回自省结果而不是数据

如何调试涉及 TCP 中继的慢速 TCP 连接

如何正确使用身份服务器 4 的自省端点?