标签: apollo-server

使用GraphQL Apollo跟踪在线用户

我需要在GraphQL Apollo Node.js服务器上处理"用户现在在线"和"用户现在离线"的事件.最好的方法是什么?

我的调查:我非常确定我不需要实现任何心跳逻辑,因为订阅正在处理WebSockets.但是我没有在他们的文档中找到任何关于如何处理WebSockets事件的信息,例如"连接"和"断开连接"...实际上我可以从实际订阅的外部处理这些事件:

SubscriptionServer.create({
    execute,
    subscribe,
    schema,
    onConnect = (...args) => {
        console.log('User connected')
    },
    onDisconnect = (...args) => {
        console.log('User disconnected')
    }
}, {
    server: ws,
    path: '/subscriptions'
})
Run Code Online (Sandbox Code Playgroud)

但无法确定通过此套接字连接的用户.

我的实现:现在我让它像那样工作:

  1. 我们为所有调用表达了中间件,它将用户对象从jsonwebtoken推送到req对象.在这里,我可以触发"用户现在在线"的逻辑.

  2. 我已经创建了单独的订阅,客户端在登录时订阅它并在注销时取消订阅.由于没有取消订阅处理程序,我设法确定在没有有效负载的情况下在用户断开连接时调用过滤器函数,所以我采用了这种方法:

    userOnlineSubscription: {
        subscribe: withFilter(
            () => pubSub.asyncIterator('userOnlineSubscription'),
                async (payload, variables) => {
                    if (!payload) {
                        // set user offline
                }
                return false
            }
        )
    }
    
    Run Code Online (Sandbox Code Playgroud)

至于我,上面的解决方案是丑陋的.有人可以推荐更好的方法吗?

websocket node.js apollo graphql apollo-server

8
推荐指数
1
解决办法
872
查看次数

是否可以有部分联合网关?

我想联合服务,但为了简单起见,让联合网关也拥有自己的模式和逻辑,可以代理 REST API 端点。现在看起来我需要分别拥有联合网关服务、联合 graphql 服务和其余 <->graphql 桥接服务。无论如何,在我们的例子中,rest-graphql 网关至少暂时可以位于联邦网关中,以避免不必要的引导和维护。

看起来阿波罗联邦网关localServiceList似乎正是为了这个目的。一个示例配置:

const gateway = new ApolloGateway({
    serviceList: [
        { name: "some-service", url: "http://localhost:40001/graph" }
    ],
    localServiceList: [
        { name: "rest-bridge", typeDefs }
    ]
});
Run Code Online (Sandbox Code Playgroud)

但它并没有解决问题:如果有 localServiceList,它会跳过 serviceList。

所以问题是:这是否可以在阿波罗联盟网关中保存自己的模式和逻辑?

federation apollo graphql apollo-server apollo-federation

8
推荐指数
1
解决办法
1304
查看次数

如何在graphql中使用passport-local

我正在尝试在我的项目中实现 GraphQL,我想passport.authenticate('local')在我的登录中使用Mutation

我想要的代码改编:

const typeDefs = gql`
type Mutation {
      login(userInfo: UserInfo!): User
    }
`

 const resolvers = {
    Mutation: {
      login: (parent, args) => { 
        passport.authenticate('local')
        return req.user
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:

  1. passport设计多为REST / Express吗?
  2. 我可以操作passport.authenticate方法(将用户名和密码传递给它)吗?
  3. 这甚至是一种常见做法还是我应该坚持使用一些 JWT 库?

passport-local passport.js graphql apollo-server

8
推荐指数
2
解决办法
3564
查看次数

通过 API 网关代理 Apollo 服务器 websocket

我有一个在 AWS Fargate (ECS) 中运行的 GraphQL Apollo 服务器,我在顶部使用 API Gateway(HTTP 代理集成)。除了安全 SSL (HTTPS) 之外,该 API 的目的是利用 Cognito Authorizer。

就涉及 Graphql HTTP 操作(查询和变异)而言,这工作正常

然而 Graphql 订阅正在使用 websockets。代理集成似乎无法处理对 websocket 协议的升级。

我尝试按照此文档定义新的 websocket API:https : //docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html

但似乎没有什么对我有用。我已经尝试使用 HTTP 代理集成到 Apollo 服务器端点来定义 $connect、$disconnect 和 $default,但我不断收到:

Error during WebSocket handshake: Unexpected response code: 400
Run Code Online (Sandbox Code Playgroud)

是否可以使用 Amazon API Gateway 代理现有的 websocket API?HTTP 代理集成是要使用的正确集成吗?

注意:客户端实现很好,因为如果我将直接 url 放到 Apollo 服务器 websocket 端点,我的订阅就可以工作。

amazon-web-services websocket graphql aws-api-gateway apollo-server

8
推荐指数
0
解决办法
1548
查看次数

您如何模拟 Apollo Server RESTDataSource 以使用 Jest 进行单元测试?

我正在尝试测试基于 Apollo Server 的 Apollo Server 中的数据源RESTDataSourcehttps://www.apollographql.com/docs/apollo-server/data/data-sources/#rest-data-source)。我正在尝试使用 Jest 对其进行测试。该类具有从外部 REST API 以及从调用第二个 API 的另一个模块中提取数据的方法(因此这RESTDataSource最终取决于两个外部 API,其中一个在此处直接调用,一个在此处间接调用) )。

我不是测试专家,我不清楚如何模拟外部 API。GraphQL Tools 有一些工具可以让你模拟你的服务器,但我不确定那是我想要的。或者我应该使用Jest 的方法来模拟ES6 类,忘记这是一个 GraphQL 服务器?如果是这样,由于我正在使用 a class,我是否只是使用类似于模拟方法的方法来模拟MyClass.myMethod方法?

如果我使用的是 TypeScript(我就是),除了设置 Jest 以使用 TypeScript 之外,我的操作方式有什么变化吗?

显然正确的路线是选择上面的选项之一,但我有点“只见树木不见森林”,也就是说,由于我缺乏测试经验,我不知道哪个是正确的要遵循的路线。

感谢您提供任何线索。

unit-testing typescript apollo jestjs apollo-server

8
推荐指数
1
解决办法
1456
查看次数

Apollo Server的自定义错误对象

我正在尝试使用apollo-server的自定义错误,似乎我的自定义错误有一个code内部不可用的属性()formatError.

import ExtendableError from 'es6-error'

export default class MyError extends ExtendableError {
  constructor(args) {
    let code = Object.keys(args)[0]
    let message = Object.values(args)[0]
    super(message)
    this.code = code
  }
}
Run Code Online (Sandbox Code Playgroud)

我有一个简单的错误处理程序工作原理如下:

let INVALIDREQUEST = 'invalid request'
let e = new MyError({INVALIDREQUEST})
console.log(e.code) // => "INVALIDREQUEST"
Run Code Online (Sandbox Code Playgroud)

我遇到了麻烦,因为当我error.code从内部登录时,formatError它无法使用.

formatError: function (error) {
  console.log(error.code) // => undefined
  return error
}
Run Code Online (Sandbox Code Playgroud)

如何从内部传播自定义属性(如code)?errorformatError

javascript ecmascript-6 graphql apollo-server

7
推荐指数
2
解决办法
3962
查看次数

Apollo Server:dataSources与上下文结合使用以与数据库一起使用

看完本文档后,我不确定是否要像其他时候一样使用简单的上下文,或者最好使用dataSources处理数据库。

DataSource是与数据库通信的正确方法,还是最好仅将其与REST API进行通信?

基本上,在这种情况下使用dataSources和context有什么好处吗?

apollo-server

7
推荐指数
1
解决办法
303
查看次数

缺少 GET 查询:在 Express 服务器上使用 Apollo 实现 GraphQL

我正在遵循此处的教程:在 Express 服务器上使用 Apollo 实现 GraphQL ,并且我在浏览器中收到错误GET 查询丢失http://localhost:7700/graphql

首先我自己输入了所有代码。当我遇到错误时,我从GitHub下载了代码:kimobrian/GraphQL-Express:使用GraphQL实现的Express Server,以消除我犯错误的可能性。但是,我仍然遇到同样的错误。

我认为最好提供存储库的链接,而不是将代码粘贴到此处,因为我使用存储库中的相同代码。另外,我不确定哪个文件可能包含问题。

$ npm start

> tutorial-server@1.0.0 start kimobrian/GraphQL-Express.git
> nodemon ./server.js --exec babel-node -e js

[nodemon] 1.18.9
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `babel-node ./server.js`
GraphQL Server is now running on http://localhost:7700
Run Code Online (Sandbox Code Playgroud)

错误是浏览器中http://localhost:7700/graphql缺少 GET 查询。Firefox 和 Chromium 中也是如此。

更新:我发现的相关信息的唯一问题在这里:nodejs with Graphql。建议的解决方案是

server.use('/graphiql', graphiqlExpress({
  endpointURL: '/graphql',
}));
Run Code Online (Sandbox Code Playgroud)

然而,这正是我已经拥有的代码(来自教程)。这是我的全部server.js

import express from …
Run Code Online (Sandbox Code Playgroud)

node.js express apollo graphql apollo-server

7
推荐指数
1
解决办法
3万
查看次数

记录每个请求的Apollo服务器GraphQL查询和变量

使用apollo-server 2.2.1或更高版本时,如何为每个请求,查询和变量记录一个日志?

这似乎是一个简单的要求和常见用例,但是文档非常模糊,并且query传递给的对象formatResponse 不再具有queryStringvariables属性。

apollo-server

7
推荐指数
4
解决办法
3275
查看次数

基于嵌套字段的过滤器从 apollo-server 返回数据

是否可以为 apollo 中基于嵌套字段过滤器的查询返回数据?例如:

询问:

Users($filter: String!) {
  user(filter: $filter) { 
    id, 
    name, 
    address(filter: $filter) { 
       street, 
       city, 
       country
    } 
  } 
}
Run Code Online (Sandbox Code Playgroud)

类型定义:

Query: {
   users(filter: String): [User]!
}

User: {
    id: ID!,
    name: String!,
    address: Address
}

Address: {
    street: String!,
    city: String!,
    country: String!
}
Run Code Online (Sandbox Code Playgroud)

阿波罗解析器:

const resolverMap = {
  Query: {
    User(obj, args, context, info) {
      // query api for User info (not including address)
      // the final results of the query should only return users with the …
Run Code Online (Sandbox Code Playgroud)

apollo reactjs graphql apollo-server

7
推荐指数
1
解决办法
780
查看次数