gpt4 book ai didi

node.js - 我如何使用仅具有 Apollo Server 2 graphql 端点的快速中间件

转载 作者:搜寻专家 更新时间:2023-10-31 23:14:57 25 4
gpt4 key购买 nike

我想对我的所有路由使用 morgantiny 日志语句,graphql 端点除外。我正在使用 express 和 Apollo 2,但无法让中间件与 express 一起使用。如代码示例所示,我可以为整个 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 })
}

谢谢!

最佳答案

有一些“Hacky”方法可以实现您的愿望。您可以改用 express.Route 在每个路由上注册中间件,但我认为您可能需要更多关于 GraphQL 的特定日志,而不是特定的请求。

上下文()

作为 ApolloServer 内部的回调可用,它接收带有请求和响应的对象。

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

格式响应()

作为 ApolloServer 内部的回调,它接收响应和查询。

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

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

资料来源: formatResponse , context

编辑

您可以做的另一件事是在 morgan 回调上检查 req.path 是否与 /graphQL 路径匹配,并且仅在这种情况下记录,但这与记录 Express.Route 非常相似与 morgan

关于node.js - 我如何使用仅具有 Apollo Server 2 graphql 端点的快速中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53559999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com