подключить 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))
Другие вопросы по тегам