【问题标题】: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 或我的服务器的等效项。

标签: facebook reactjs relayjs graphql sangria


【解决方案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 可能知道更多。
      猜你喜欢
      • 1970-01-01
      • 2011-04-09
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多