我想对我的所有路由(除graphql端点之外)使用morgan
的{{1}}日志语句。我正在使用express和Apollo 2,但无法使中间件与Express一起使用。如代码示例所示,我可以为整个express应用程序安装中间件,但是我想限制范围。
我的第一个尝试是创建一个tiny
并将路由器传递到express.router()
,但这似乎不起作用。
我想使用apolloServer.applyMiddleware
-但我也想使用morgan
中间件。
express-jwt
谢谢!
答案 0 :(得分:2)
有一些“怪异”的方法可以实现您想要的。您可以改用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;
},
});
您可以做的另一件事是在morgan回调上检查req.path是否与/graphQL
路径匹配,并且仅在这种情况下登录,但这与使用Morgan记录Express.Route相同。>
答案 1 :(得分:0)
const express = require("express");
const router = express.Router();
const { ApolloServer, gql } = require('apollo-server-express');
const server = new ApolloServer({
schema: schema,
introspection: true
});
server.applyMiddleware({ app:router });
module.exports = router;
答案 2 :(得分:0)
有一个 npm 包 GraphQL-Router-Ware
使用它,您可以像我们在 express 中所做的那样,将路由器级别的中间件添加到您的解析器中。
您可以像这样设置解析器:
import Router from 'graphql-router-ware';
import { checkPermission } from '../helpers/userhalper';
import Controller from '../controllers/page';
const resolvers = {
Query: {
singlePage: Router(Controller.singlePage)
},
Mutation: {
createPage: Router(checkPermission,Controller.create),
updatePage: Router(checkPermission,Controller.update),
}
}
export default resolvers;
接着是你的中间件:
// ....
export checkPermission=({ ctx },next)=>{
if(!ctx.user){
return next(new Error('Not logged in'));
// or throw new Error('Not logged in')
}
// some more permission checks....
return next();
};
// ....
希望这对您有所帮助。
答案 3 :(得分:-1)
使用apollo服务器v2,仅在一条路由上使用它就非常简单。将其用作中间件。 即
const app = require('express')();
const apolloServer = new ApolloServer ({
typeDefs,
resolvers
})
// then use it on a particular route
apolloServer.applyMiddleware({ app, path: '/specialUrl' });