如何使用 Apollo Express 仅为 Graphql 后端中的特定解析器设置中间件?

Posted

技术标签:

【中文标题】如何使用 Apollo Express 仅为 Graphql 后端中的特定解析器设置中间件?【英文标题】:how to set a middleware only for a specific resolver in Graphql backend using Apollo Express? 【发布时间】:2021-12-04 14:03:41 【问题描述】:

在 Rest API 中,如果你想为特定的路由设置一个中间件,你可以使用这个例子:

router
  .route('/top-5-cheap')
  .get(tourControllers.middleAliasApi, tourControllers.getAllTours);

所以在这种情况下,只有当用户向该路由发送请求时才会执行 middleAliasApi 中间件。

我怎样才能在 Graphql 应用程序中做同样的事情? 例如,仅当用户查询特定解析器时才执行中间件。 我在后端使用 Apollo-express-server。

【问题讨论】:

【参考方案1】:

您可以使用graphql-middleware 包。您可以为特定的解析器创建中间件。例如

const  ApolloServer  = require('apollo-server');
const  makeExecutableSchema  = require('@graphql-tools/schema');
const  applyMiddleware  = require('graphql-middleware');

// Minimal example middleware (before & after)
const beepMiddleware = 
  Query: 
    hello: async (resolve, parent, args, context, info) => 
      // You can use middleware to override arguments
      const argsWithDefault =  name: 'Bob', ...args ;
      const result = await resolve(parent, argsWithDefault, context, info);
      // Or change the returned values of resolvers
      return result.replace(/Trump/g, 'beep');
    ,
    tours: async (resolve, parent, args, context, info) => 
      const result = await resolve(parent, args, context, info);
      return result.concat([4]);
    ,
  ,
;

const typeDefs = `
  type Query 
    hello(name: String): String
    tours: [Int]!
  
`;
const resolvers = 
  Query: 
    hello: (parent,  name , context) => `Hello $name ? name : 'world'!`,
    tours: () => [1, 2, 3],
  ,
;

const schema = makeExecutableSchema( typeDefs, resolvers );

const schemaWithMiddleware = applyMiddleware(schema, beepMiddleware);

const server = new ApolloServer(
  schema: schemaWithMiddleware,
);

server.listen( port: 8008 ).then(() => console.log('Server started at http://localhost:8008'));

查询结果:

⚡  curl -H 'Content-Type: application/json' -X POST -d '"query": " tours "' http://localhost:8008/graphql
"data":"tours":[1,2,3,4]

软件包版本:

"graphql-middleware": "^3.0.3",
"apollo-server": "^2.15.1",

【讨论】:

以上是关于如何使用 Apollo Express 仅为 Graphql 后端中的特定解析器设置中间件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Express 和 Apollo-Server 获取 HTTP 授权标头

在 Apollo-Server v2 中间件之后如何使用 Express 中间件?

如何正确互连 Apollo Server/mongodb/express?

Apollo-Server,如何与 SailsJS 一起使用?

如何选择性地允许 apollo-server-express 中的查询?

使用 Express-GraphQL 和 React-Apollo 订阅 GraphQL