我们如何为 Feathersjs + Apollo v2 使用钩子?

How do we use hook for Feathersjs + Apollo v2?

为 Feathersjs + Apollo v2 设置挂钩时遇到问题。需要它的主要原因是授权。

src/services/graphql/graphql.service.js:65
  service.hooks(hooks);
      ^
TypeError: Cannot read property 'hooks' of undefined

以下是我在 Feathersjs 服务中设置 Apollo v2 的代码。由于它没有带模型,我不确定挂钩的正确设置方法是什么。

const { ApolloServer, gql } = require('apollo-server-express');
const hooks = require('./graphql.hooks');

module.exports = function (app) {

  const typeDefs = gql`
    type Query {
      hello: String
    }
  `;

  const resolvers = {
    Query: {
      hello: () => 'hello world'
    }
  };

  const server = new ApolloServer({
    typeDefs: typeDefs,
    resolvers: resolvers,
    context: ({req, res}) => ({
      provider: req.feathers.provider,
      headers: req.feathers.headers,
      token: req.headers['auth-token']
    }),
    playground: {
      endpoint: 'http://localhost:3030/graphql',
      settings: {
        'editor.theme': 'light'
      }
    }
  });

  server.applyMiddleware({ app });

  // app.use('/graphql', createService);

  const service = app.service('graphql');

  service.hooks(hooks);
};

所以,feathers 的 REST 支持并不能真正满足您的需求。

如果您将 Feathers 服务传递给 app.use,它将作为 hook 等生态系统的一部分提供。如果您只是传递 Express 服务(或间接传递,如 applyMiddleware ) 那么 Feathers 将跳过它。它已在 Express 中注册,但不在 app.services 的 Feathers 服务列表中。

您可以使用链接 Express-type 中间件和 Feathers 服务的 Feathers 注册服务,例如:

app.use('/thing',
  (req, res, next) => {
     // does something
     next();
  },
  {
    get(id, params) {
      // feathers stuff
    }
  }
);

此时整个服务可用于 Feathers 生态系统、挂钩等

你可以做的是:

  server.applyMiddleware({ app, path: 'graphql' });
  app.use('graphql', {
    create(data, params) {
    },
    get(id, params) {
    },
    find(params) {
    },
    update(id, data, params) {
    },
    patch(id, data, params) {
    },
    delete(id, params) {
    }
  }); 
  app.service('graphql').hooks(hooks);

在设置 /graphql 内容后链接 (no-op) 服务,但我不确定您是否必须在这些服务中加入一些逻辑才能正确处理数据.请记住,羽毛服务假设 JSON 等

您的另一个选择是在 Express 中间件中验证您的授权令牌(我假设来自 authentication-jwt 的 JWT?),而不是尝试 Feather-ize /graphql 服务.