Graphql 我们如何为Feathersjs+;阿波罗2号?

Graphql 我们如何为Feathersjs+;阿波罗2号?,graphql,apollo-server,feathersjs,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服务中设置阿波罗v2的代码。由于它没有携带模型,我不确定设置挂钩的正确方法 const { ApolloServer, g

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

src/services/graphql/graphql.service.js:65
  service.hooks(hooks);
      ^
TypeError: Cannot read property 'hooks' of undefined
以下是我在Feathersjs服务中设置阿波罗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
它将作为hooks等生态系统的一部分提供。如果您只是传递Express services(或者像
applyMiddleware
那样间接传递),则Feathers将跳过它。它已在Express中注册,但不在
app.services
中的服务列表中

您可以使用链接Express类型中间件和Feathers服务的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
之后链接(无操作)服务,但我不确定您是否需要在这些服务中加入一些逻辑来正确读取数据。记住,feathers服务采用JSON等


您的另一个选择是在graphql的Express中间件中验证您的授权令牌(我假设是来自身份验证JWT的JWT?),而不是尝试将/graphql服务羽化。

有趣-好的,
server.applyMiddleware
调用
app。在封面下使用
。你能展示一下你是如何创建你的初始
app
对象以及你是如何注册这项服务的吗?这是一个全新的feathersjs项目。因此,初始
app
调用
const services=require('./services')
和services index.js调用const graphql=require('./graphql/graphql.service.js'),这是上面的示例。因此,app是
const app=express(feathers())?是的,
const-app=express(feathers())后接app.use和app.configure,例如
app.configure(服务)。如果我想从feathersjs获取用户信息(如ID)并对结果进行过滤,该怎么办?你可以颠倒顺序,先放Feathers服务,然后链接一个express风格的中间件。这似乎可行,但由于'server.applyMiddleware',我无法再访问graphQL游乐场({app,path:'graphql'});`。似乎是阿波罗的限制,