Прежде всего, я довольно новичок в фактическом размещении сообщений в Stack Overflow, но я, конечно, сделаю все возможное, чтобы получить всю необходимую информацию здесь, и поделюсь найденным решением, потому что я могу представить, что у большего количества людей могут возникнуть проблемы с этим.
Итак, мы начали с системы, которая имеет несколько небольших микросервисов в качестве внутреннего интерфейса, и мы нашли сервер Apollo, который может извлекать схемы из конечных точек graphql и объединять их вместе, чтобы у нас была одна хорошая точка входа.У нас это работает, но серверу apollo нечем помочь с общей архитектурой.Вот когда мы нашли NestJS и потому, что мы используем angular на внешнем интерфейсе, а NestJS настолько симуляционен, что кажется идеальным.
Проблема, с которой мы столкнулись, заключается в том, что мы не можем получитьследующие функциональные возможности работают: - Я хотел бы иметь модуль, который содержит сервис, которому может быть предоставлено несколько конечных точек (от URI до микросервисов) - С учетом заданных точек сервис должен получить схемы graphQL из этих конечных точек и превратить их в RemoteExecutableSchemas изатем объединить их.- После объединения их и создания 1 большой схемы с информацией (удаленной) ссылки, чтобы GraphQL знал, где получить данные.- После того, как это произошло, мы хотели бы добавить некоторые строчки, чтобы присутствовали все отношения (но это не та проблема, в которой я лежу)
Я просматривал официальные документы (https://docs.nestjs.com/graphql/quick-start)через примеры из них (https://github.com/nestjs/nest/tree/master/sample/12-graphql-apollo) и, конечно, проверил проект GitHub (https://github.com/nestjs/graphql) и был в этом репо, чтобы посмотреть, что код делает на фоне.
МыМы пробовали несколько вещей, чтобы получить их на лету, но не смогли получить схемы в GraphQLModule до того, как он был создан. Затем мы подумали, что может быть приемлемо, чтобы служба извлекла graphqlSchema из конечной точки и записала его в файл с помощью printSchema(схема), которая на самом деле работает, но затем я теряю информацию о связи, фактически превращая ее в локальную схему вместо удаленной. Теперь мы придумали следующее, но снова застряли.
Давайте начнем снебольшой фрагмент из моего package.json, чтобы люди знали версии :)
"dependencies": {
"@nestjs/common": "^5.4.0",
"@nestjs/core": "^5.4.0",
"@nestjs/graphql": "^5.5.1",
"apollo-link-http": "^1.5.9",
"apollo-server-express": "^2.3.2",
"graphql": "^14.1.1",
"reflect-metadata": "^0.1.12",
"rimraf": "^2.6.2",
"rxjs": "^6.2.2",
"typescript": "^3.0.1"
},
"devDependencies": {
"@nestjs/testing": "^5.1.0",
"@types/express": "^4.16.0",
"@types/jest": "^23.3.1",
"@types/node": "^10.7.1",
"@types/supertest": "^2.0.5",
"jest": "^23.5.0",
"nodemon": "^1.18.3",
"prettier": "^1.14.2",
"supertest": "^3.1.0",
"ts-jest": "^23.1.3",
"ts-loader": "^4.4.2",
"ts-node": "^7.0.1",
"tsconfig-paths": "^3.5.0",
"tslint": "5.11.0"
},
Итак, на данный момент у меня естьмодуль обработчика схемы, который выглядит следующим образом:
@Module({
imports: [GraphQLModule.forRootAsync({
useClass: GqlConfigService
})],
controllers: [SchemaHandlerController],
providers: [SchemaFetcherService, SchemaSticherService, GqlConfigService]
})
export class SchemaHandlerModule {
}
Итак, мы импортируем GraphQLModule и позволяем ему использовать сервис gql-config для обработки, предоставляя ему GraphQLModuleOptions.
gql-Служба конфигурации выглядит следующим образом:
@Injectable()
export class GqlConfigService implements GqlOptionsFactory {
async createGqlOptions(): Promise<GqlModuleOptions> {
try{
const countrySchema = this.createCountrySchema();
return {
typeDefs: [countrySchema]
};
} catch(err) {
console.log(err);
return {};
}
}
Так что я асинхронно создаю GqlModuleOptions и жду результата.Функции createCountrySchema выглядят так:
public async createCountrySchema() : GraphQLSchema{
const uri = 'https://countries.trevorblades.com/Graphql';
try {
const link = new HttpLink({
uri: uri,
fetch
});
const remoteSchema = await introspectSchema(link);
return makeRemoteExecutableSchema({
schema: remoteSchema,
link
});
} catch (err) {
console.log('ERROR: exception when trying to connect to ' + uri + ' Error Message: ' + err);
}
};
Ради POC я только что получил простой общедоступный API-интерфейс graphQL в качестве конечной точки.Эта функция возвращает объект GraphQLSchema, который я бы затем хотел (в некотором роде) добавить в GqlOptions и сделать его видимым на игровой площадке.Мы также пытались, чтобы createCountrySchema возвращала Promise и ожидала его при вызове функции в createGqlOptions, но это, похоже, не имеет значения.
Получаемая нами актуальная ошибка выглядит следующим образом:
[Nest] 83 - 2/1/2019, 2:10:57 PM [RoutesResolver] SchemaHandlerController {/schema-handler}: +1ms
apollo_1 | (node:83) UnhandledPromiseRejectionWarning: Syntax Error: Unexpected [
apollo_1 |
apollo_1 | GraphQL request (2:9)
apollo_1 | 1:
apollo_1 | 2: [object Promise]
apollo_1 | ^
apollo_1 | 3:
apollo_1 |
apollo_1 | at syntaxError (/opt/node_modules/graphql/error/syntaxError.js:24:10)
apollo_1 | at unexpected (/opt/node_modules/graphql/language/parser.js:1483:33)
apollo_1 | at parseDefinition (/opt/node_modules/graphql/language/parser.js:155:9)
apollo_1 | at many (/opt/node_modules/graphql/language/parser.js:1513:16)
apollo_1 | at parseDocument (/opt/node_modules/graphql/language/parser.js:115:18)
apollo_1 | at parse (/opt/node_modules/graphql/language/parser.js:50:10)
apollo_1 | at parseDocument (/opt/node_modules/graphql-tag/src/index.js:129:16)
apollo_1 | at Object.gql (/opt/node_modules/graphql-tag/src/index.js:170:10)
apollo_1 | at GraphQLFactory.<anonymous> (/opt/node_modules/@nestjs/graphql/dist/graphql.factory.js:48:55)
apollo_1 | at Generator.next (<anonymous>)
apollo_1 | (node:83) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
apollo_1 | (node:83) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Я думаю, что я довольно близок с этим подходом, но я не совсем уверен.Ошибка, которую я получаю, гласит, что все Обещания должны быть обработаны с помощью try / catch, чтобы мы не получили необработанное Обещание, и я считаю, что я делаю это везде, поэтому я не понимаю, откуда эта ошибка ...
Если у кого-нибудь есть указания, решения или советы, я был бы очень, очень рад.Я боролся за то, чтобы функциональность, которую мы хотим разместить в nestjs, уже больше недели и видел множество примеров, фрагментов и обсуждений по этому вопросу, но я не могу найти пример, который объединяет удаленные схемы и передает их обратно nestjs.
Буду очень признателен за любые комментарии по этому поводу, с наилучшими пожеланиями, Tjeerd