如何仅将快速中间件与Apollo Server 2 graphql端点一起使用

时间:2018-11-30 15:03:15

标签: node.js express graphql apollo apollo-server

我想对我的所有路由(除graphql端点之外)使用morgan的{​​{1}}日志语句。我正在使用express和Apollo 2,但无法使中间件与Express一起使用。如代码示例所示,我可以为整个express应用程序安装中间件,但是我想限制范围。

我的第一个尝试是创建一个tiny并将路由器传递到express.router(),但这似乎不起作用。

我想使用apolloServer.applyMiddleware-但我也想使用morgan中间件。

express-jwt

谢谢!

4 个答案:

答案 0 :(得分:2)

有一些“怪异”的方法可以实现您想要的。您可以改用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;
  },
});

来源: formatResponsecontext

编辑

您可以做的另一件事是在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' });