Как я могу использовать промежуточное программное обеспечение Express только с конечными точками Apollo Server 2 graphql - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу использовать morgan операторы tiny log для всех моих маршрутов, кроме конечных точек graphql.Я использую Express и Apollo 2, и мне не удалось заставить промежуточное ПО работать с Express.Как показывает пример кода, я могу установить промежуточное программное обеспечение для всего экспресс-приложения, но я хочу ограничить область действия.

Моя первая попытка состояла в создании express.router() и передаче маршрутизатора на apolloServer.applyMiddleware, ноэто не похоже на работу.

Я хочу использовать morgan - но я также хочу использовать express-jwt промежуточное ПО.

import morgan from 'morgan'
import { mergeSchemas } from 'graphql-tools'
import { ApolloServer } from 'apollo-server-express'

import assessmentSchema from './assessment/schema'
import AssessmentAPI from './assessment/dataSource'

import userSchema from './user/schema'
import UserAPI from './user/dataSource'

/**
 * Installs apollo-server to handle requests under `path`
 * @param {*} app Express instance
 * @param {*} path route path, like '/graphql'
 */
export const createApi = (app, path) => {
  const dataSources = () => ({
    assessmentAPI: new AssessmentAPI({ store: 'intentionally undefined' }),
    userAPI: new UserAPI()
  })

  const schema = mergeSchemas({
    schemas: [assessmentSchema, userSchema]
  })

  morgan.token('graphql-query', req => {
    const { operationName } = req.body
    return `GRAPHQL: Operation Name: ${operationName}`
  })

  // TODO: Add custom logging middleware for GraphQL queries/mutations
  // The next line would add middleware to all of express, but I only want this style of logging for graphQL

  /*** Question is about the following line ***/
  // app.use(morgan(':graphql-query'))

  const apolloServer = new ApolloServer({ schema, dataSources })
  apolloServer.applyMiddleware({ app, path })
}

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 августа 2019

С сервером Apollo v2 действительно просто использовать его только на одном маршруте.применять его в качестве промежуточного программного обеспечения.т.е.

const app = require('express')();
const apolloServer = new ApolloServer ({
   typeDefs,
   resolvers
}) 

// then use it on a particular route

apolloServer.applyMiddleware({ app, path: '/specialUrl' });
0 голосов
/ 03 декабря 2018

Есть несколько «хакерских» способов достичь желаемого.Вместо этого вы можете использовать express.Route для регистрации промежуточного программного обеспечения на каждом маршруте, но я думаю, что вам могут потребоваться более конкретные журналы о GraphQL, а не запрос в частности.

context ()

Доступно какобратный вызов внутри ApolloServer, он получает объект с запросом и ответом.

const myServer =  new ApolloServer({
  schema: ...,
  context:({ req, res }) => { 
    // log here
  }
});

fortmatResponse ()

Доступен как обратный вызов внутри ApolloServer, он получает ответ и запрос.

const server = new Apollo.ApolloServer({
  schema: ...,
  formatResponse: (res, query) => {
    // log here

    // notice you must return the response
    return res;
  },
});

Источники: formatResponse , context

Edit

Еще одна вещь, которую вы можете сделать, - это проверить морган обратного вызова, если требуется.path совпадает с путем /graphQL и регистрируется только в этой ситуации, но это почти то же самое, что регистрировать Express.Route с morgan

...