与 apollo-server 的 Websocket 连接为 connectionParams 返回乱码

Posted

技术标签:

【中文标题】与 apollo-server 的 Websocket 连接为 connectionParams 返回乱码【英文标题】:Websocket connection with apollo-server returns gibberish for connectionParams 【发布时间】:2018-07-17 07:12:13 【问题描述】:

onConnect 应该接收客户端提供的connectionParams,然后通过检查connectionParams 对象上的token 属性来验证令牌没有过期。在客户端,我发送这些参数如下:

const subOptions = 
  reconnect: true,
  connectionParams: async () => 
    let token = await get("token")
    let ret = 
      token,
    

    console.log("WEBSOCKET RETURN OBJECT", ret)

    return ret
  ,


const subClient = new SubscriptionClient(subEndpoint, subOptions)
const subLink = new WebSocketLink(subClient)

在客户端:

“ON CONNECT”后打印的对象被打乱,显示如下。它如何以这种格式来自客户端?我该如何进一步调试?

在服务器上:

const ws = createServer(app)

ws.listen(PORT, () => 
  console.log(`GraphQL Server is now running on http://localhost:$PORT`)
  // Set up the WebSocket for handling GraphQL subscriptions
  new SubscriptionServer(
    
      execute,
      subscribe,
      schema,
      onConnect: (connectionParams, webSocket) => 
        let req = 

        console.log("ON CONNECT")
        console.log(connectionParams)

        return checkToken(connectionParams.token, function(payload) 
          return 
            user: 
              id: payload.userId,
              exp: payload.exp,
              iat: payload.iat,
            ,
          
        )
      ,
    ,
    
      server: ws,
      path: "/subscriptions",
    
  )
)

【问题讨论】:

【参考方案1】:

暂时不能对 connectionParams 使用异步函数。

这是一个解决方法:

const wsLink = new WebSocketLink(
  uri: wsUri,
  options: 
    reconnect: true,
  ,
);
wsLink.subscriptionClient.use([
  async applyMiddleware(options, next) 
    const token = await getLoginToken();
    options.context =  token ;
    next();
  ,
]);

【讨论】:

以上是关于与 apollo-server 的 Websocket 连接为 connectionParams 返回乱码的主要内容,如果未能解决你的问题,请参考以下文章

本人对于netty框架的一些理解,怎么与网站上的websock建立连接

Android websock 应用

登录 apollo-server 的推荐方式

用 Apollo-server 和 Prisma 2 开玩笑

websock第一次连不上window

websock使用