подключить ECONNREFUSED, Федерация Аполлона
Решил изучить Федерацию Аполлонов на примере с их сайта. У меня есть три сервиса, которые я пытаюсь объединить в рамках федерации, но я обнаружил эту ошибку:
Проверка на наличие изменений в определениях служб: не удалось загрузить определения служб для «учетных записей» по адресу http: // localhost:4001: запрос на http: // localhost:4001 / не выполнен, причина: подключить ECONNREFUSED 127.0.0.1:4001 Эти данные На графике отсутствует допустимая конфигурация. Не удалось загрузить определения служб для «учетных записей» по адресу http: // localhost:4001: запрос на http: // localhost:4001 / не выполнен, причина: подключение ECONNREFUSED 127.0.0.1:4001
Код сервисов и шлюз apollo:
учетные записи
const { ApolloServer, gql } = require('apollo-server');
const { buildFederatedSchema } = require('@apollo/federation');
const typeDefs = gql`
extend type Query {
me: User
}
type User @key(fields: "id") {
id: ID!
username: String
}
`;
const resolvers = {
Query: {
me() {
return { id: "1", username: "@ava" }
}
},
User: {
__resolveReference(user, { fetchUserById }){
return fetchUserById(user.id)
}
}
}
const server = new ApolloServer({
schema: buildFederatedSchema([{ typeDefs, resolvers }]),
introspection: true
});
server.listen(4001).then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});
товары
const { ApolloServer, gql } = require('apollo-server');
const { buildFederatedSchema } = require('@apollo/federation');
const typeDefs = gql`
extend type Query {
topProducts: Product
}
type Product @key(fields: "upc") {
upc: String!
name: String!
price: Int
}
`;
const resolvers = {
Query: {
topProducts() {
return { upc: "one", name: "Computer", price: "3000" }
}
},
Product: {
__resolveReference(Product, { fetchProductByupc }){
return fetchProductByupc(Product.upc)
}
}
}
const server = new ApolloServer({
schema: buildFederatedSchema([{ typeDefs, resolvers }]),
introspection: true
});
server.listen(4002).then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});
отзывы
const { ApolloServer, gql } = require('apollo-server');
const { buildFederatedSchema } = require('@apollo/federation');
const typeDefs = gql`
type Review {
body: String
author: User @provides(fields: "username")
product: Product
}
extend type User @key(fields: "id") {
id: ID! @external
reviews: [Review]
}
extend type Product @key(fields: "upc") {
upc: String! @external
reviews: [Review]
}
`;
const resolvers = {
Review: {
body() {
return { body: "Very good", author, product }
}
},
User: {
__resolveReference(body, { fetchUserByauthor }){
return fetchUserByauthor(body.author)
}
}
}
const server = new ApolloServer({
schema: buildFederatedSchema([{ typeDefs, resolvers }]),
introspection: true
});
server.listen(4003).then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});
шлюз аполлона
const { ApolloServer} = require('apollo-server');
const { ApolloGateway} = require('@apollo/gateway');
const gateway = new ApolloGateway({
serviceList: [
{ name: 'accounts', url: 'http://localhost:4001' },
{ name: 'products', url: 'http://localhost:4002' },
{ name: 'reviews', url: 'http://localhost:4003' }
]
});
const server = new ApolloServer({ gateway, subscriptions: false });
server.listen(4004).then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});
1 ответ
Попробуйте использовать пакет wait-on npm. Это позволит вам дождаться определенных ресурсов, прежде чем запускать сервер шлюза. См. Пример:
const { ApolloServer } = require('apollo-server')
const { ApolloGateway } = require('@apollo/gateway')
const waitOn = require('wait-on')
const gateway = new ApolloGateway({
serviceList: [
{ name: 'accounts', url: 'http://localhost:4001' },
{ name: 'products', url: 'http://localhost:4002' },
{ name: 'reviews', url: 'http://localhost:4003' },
],
})
const options = {
resources: ['tcp:4001', 'tcp:4002', 'tcp:4003'],
}
waitOn(options)
.then(() => {
const server = new ApolloServer({ gateway, subscriptions: false })
server.listen(4004).then(({ url }) => {
console.log(`🚀 Server ready at ${url}`)
})
})
.catch((err) => console.log(err))