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

时间:2019-06-04 08:32:14

标签: graphql apollo-server feathersjs

在设置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);
};

1 个答案:

答案 0 :(得分:1)

因此,feathers的REST支持并不能真正满足您的要求。

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

您可以向链接了Express型中间件和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之后,可以

链接(无操作)服务,但是我不确定您是否需要在这些服务中添加一些逻辑以正确处理数据。请记住,feathers服务采用JSON等。

您的另一选择是在Express中间件中验证graphql内容的授权令牌(我假设是来自authentication-jwt的JWT?),而根本不尝试对/ graphql服务进行羽化处理。