GraphQL 订阅、websocket、nodejs、Express 会话

Fre*_*ors 5 session-cookies websocket express graphql apollo-server

我正在使用 Apollo Server 2(但这个问题不仅与 Apollo 相关)和 Express.js vanilla(与apollo-server-express)。

除了Express 会话机制外,所有内容也适用于订阅

问题:

我正在使用cookie-session ( https://github.com/expressjs/cookie-session,但我认为这对于express-session中间件是一样的),当我的浏览器开始与我的服务器建立新连接时,ApolloServeronConnect钩子不会'没有req属性,也没有req.session等等......

我所能做的就是从分析该cookiewebSocket.upgradeReq.headers.cookieonConnect生命周期挂钩,但它似乎对我很哈克。

编码:

const { ApolloServer } = require('apollo-server-express')

const typeDefs = require('../src/graphql/types')
const resolvers = require('../src/graphql/resolvers')
const models = require('../src/models')

const apolloServer = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req, connection }) => {
    // connection exists only on webSocket connection
    if (connection) {
      return {
        currentUser: connection.context.currentUser // <-- I NEED THIS!
      }
    }
    // if not a (webSocket) connection it is a "default" HTTP call
    return {
      models,
      currentUser: { id: req.user.id }
    }
  },
  subscriptions: {
    onConnect: (connectionParams, webSocket) => {
      // "connectionParams" is from the client but I cannot use it because cookies are HTTP-Only
      // I can retrieve cookies from here: "webSocket.upgradeReq.headers.cookie" but then I need to parse them which seems a bit hacky to me
      // return { currentUser: req.user.id } // <-- I NEED THIS (req.user.id doesn't exists)!
    }
  }
})

module.exports = apolloServer
Run Code Online (Sandbox Code Playgroud)

我在 Apollo Server Docs 站点上找不到任何内容(对于其他主题非常详细!)。

我哪里做错了?

Ric*_*nho 0

请参阅 dougwilson 的此评论:https://github.com/expressjs/cookie-session/issues/117#issuecomment-452046225以获取会话值。

\n\n
\n

如果您只想获取会话内容(而不是写回新会话——无论如何,如果没有资源,这是不可能的),您可能直接使用 cookies 模块,这就是该模块在幕后使用的内容读取cookie并验证签名。一个可能的例子:

\n\n
const Cookies = require(\'cookies\')\n\n// \xe2\x80\xa6\n\nconst cookies = new Cookies(req, null, { keys }) const session =\nJSON.parse(Buffer.from(cookies.get(\'session\'),\'base64\').toString(\'utf8\'))\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

onConnect返回您需要在 subscribe() 上使用的任何内容

\n