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

标签 javascript node.js reactjs graphql apollo

onConnect 应接收客户端提供的 connectionParams,然后通过检查 connectionParams 对象上的 token 属性来验证 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)

在客户端:

enter image description here

“ON CONNECT”后打印的对象被打乱,如下所示。它是如何从客户端最终以这种格式出现的?我怎样才能进一步调试这个?

在服务器上:

enter image description here

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",
    }
  )
})

最佳答案

目前您无法对 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();
  },
}]);

关于javascript - 与 apollo-server 的 Websocket 连接返回乱码的 connectionParams,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48656299/

相关文章:

javascript - onChange 不重定向到 URL

javascript - 组合 javascript 原型(prototype)样式

Node.js - 为什么 Mongoose 不保存数据?

javascript - Material UI 中的多行占位符文本

javascript - 尝试获取对象数量时无法读取未定义的属性 'length'

php - 单击时使用 php 调用 javascript 函数

javascript - 如何在新函数中使用带有 OnChange 的文本框中的值?

node.js - NodeJS - WinstonJS - 清除日志文件

javascript - C++ 级别的 nodeJS 模块加载

reactjs - map 组件: Cannot read property 'initialize' of undefined