2015-08-24 7 views
5

Gram z przekaźnikiem-zestawem startowym. Użyłem także sangria do utworzenia serwera graphql. Teraz próbuję połączyć te dwa elementy razem.Aplikacja przekaźnika: jak introspekować schemat na serwerze?

W zestawie przekaźnika-rozrusznika, za każdym razem, gdy zmieniasz schemat, musisz uruchomić skrypt, aby zregenerować plik schema.json. Ale ponieważ Graphql obsługuje introspekcję schematu, zastanawiam się, czy istnieje sposób, aby skonfigurować aplikację przekaźnika do introspekcji schematu z serwera podczas uruchamiania.

Czy ktoś wie, czy jest to możliwe, lub jak to zrobić?

+0

Czy to nie jest to, co robi się po uruchomieniu "npm start"? Introspekcja wygenerowanego pliku schematu za pomocą "Npm run update-schema" – MaC

+0

To nie jest introspekcja, to ładowanie 'schema.json'. To, czego chcę, to móc wysłać zapytanie do introspekcji graphql na mój serwer, aby mógł on usunąć JSON bez konieczności ciągłego uruchamiania 'npm run update-schema' lub odpowiednika dla mojego serwera. – jbrown

Odpowiedz

1

Wygląda na to musimy coś takiego (od 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); 
}); 
0

Produkt introspekcja (schema.json) jest używany przez przekaźnik Plugin Babel do sprawdzania i skompilować Relay.QL wyrażeń. Na szczęście metoda getBabelRelayPlugin akceptuje produkt introspekcyjny lub funkcję zwracającą produkt introspekcji.

Powinno być możliwe, to zrobić coś takiego w systemie build Twojej aplikacji (np 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); 
+0

Mam problem z GitHub, aby wypalić to w zestawie startowym. Jeśli ktokolwiek ma czas, zanim do niego dojdę, oto jest! https://github.com/relayjs/relay-starter-kit/issues/13 – steveluscher

+0

Czy ta pomoc trafia na zewnętrzny serwer? – jbrown

+0

'getBabelRelayPlugin()' akceptuje tylko ciąg lub synchroniczne wywołanie zwrotne. Może być możliwe jego zwiększenie, aby zaakceptować asynchroniczne wywołanie zwrotne, jeśli Babel zezwala wtyczkom działać w taki sposób. @JoeSavona może wiedzieć więcej. – steveluscher

5

zdefiniować babelRelayPlugin.js (który jest prowadzony przez WebPacka podczas walidacji zapytania graphql klient) jako takie:

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, 
}); 

Oczywiście, zmień zmienną adresu URL na dowolny adres URL serwera, którego używasz do programowania. W WebPacka, obejmuje w swojej definicji Ładowarki:

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

i wskaż lokalizację powyższego pliku babelRelayPlugin.js.