Как мы используем крючок для Feathersjs + Apollo v2? - PullRequest
1 голос
/ 04 июня 2019

Возникли проблемы с настройкой хука для Feathersjs + Apollo v2. Основная причина, по которой это необходимо, - авторизация.

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

Ниже приведены мои коды для настройки Apollo v2 в службе Feathersjs. Поскольку он не несет модель, я не уверен, как правильно настроить крючок.

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 Ответ

1 голос
/ 10 июня 2019

Итак, поддержка REST из перьев на самом деле не делает то, что вы хотите.

Если вы передадите службу Feathers app.use, она будет доступна как часть экосистемы перехватчиков и т. Д. Если вы просто перейдете к службам Express (или сделаете это косвенно, как applyMiddleware), то Feathers пропустит Это. Он зарегистрирован в Express, но его нет в списке услуг Feathers в app.services.

Вы можете зарегистрировать службы в Feathers, которые объединяют промежуточное программное обеспечение Express-типа и службы Feathers, например:

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

В этот момент весь сервис доступен для экосистемы перьев, хуков и т. Д.

Что вы можете сделать, это что-то вроде:

  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, но я не уверен, что вам не придется вводить какую-то логику в эти сервисы, чтобы корректно обрабатывать данные. Помните, что сервисы перьев предполагают JSON и т. Д.

Другим вариантом является проверка вашего токена авторизации (я полагаю, что JWT от authentication-jwt?) В промежуточном программном обеспечении Express для содержимого graphql, и вообще не пытаться использовать службу / graphql в Feather-ize.

...