Вызовите оконечную точку GraphQL из одного и того же приложения Express без выполнения HTTP-вызова - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть стандартное приложение Express, и я использую apollo-server-express для добавления к нему конечной точки GraphQL:

  const server = new ApolloServer({
    schema: executableSchema
  });

  server.applyMiddleware({ app: expressApp });

У меня остальная часть моего Express приложения, определяющего стандарт Конечные точки ОТДЫХА. Я хотел бы поддерживать оба интерфейса в рабочем состоянии (REST + GraphQL), но уменьшить дублирование logi c между, скажем, обработчиком конечной точки POST и Resolver Mutation, который рассматривается как основа логики c для эти два очень очень похожи.

Есть ли способ получить запрос в Express, переформатировать его и каким-то образом ... переслать его на конечную точку GraphQL, расположенную на том же сервере, в пределах то же самое приложение Express, без необходимости делать ненужный HTTP-вызов?

1 Ответ

1 голос
/ 02 апреля 2020

Это технически возможно, потому что вы можете напрямую выполнять запросы к схеме (см. здесь ). Однако вам придется вручную сопоставить свои контроллеры с указанными c запросами, и это излишне сложно. Лучшим вариантом является извлечение общей логики c в отдельные модули, которые затем используются как вашими решателями GraphQL, так и вашими контроллерами REST. В любом случае, лучше хранить таким образом свою бизнес-логику c отдельно от контроллеров / распознавателей - именно из-за такого сценария ios.

// post-service.js
module.exports = {
  create: (content, author) => {
    // this just calls another function, but in reality you might include any number
    // of additional steps, for example, transforming and validating the inputs
    return Post.create({ content, author })
  }
}

// post-controller.js
module.exports = async (req, res, next) => {
  const post = await PostService.create(req.body.content, req.user)
  return post
}

// resolvers.js
module.exports = {
  Mutation: {
    createPost: (root, args, ctx) => {
      const post = await PostService.create(args.content, ctx.user)
      return post
    },
  },
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...