如何使用apollo-server-epxress从graphql解析器中更新会话

时间:2017-09-30 10:05:59

标签: node.js express graphql apollo-server

我有一个基于apollo-server-express的graphql服务器。

我的解析器通常在遗留API上执行REST请求。 其中一个解析器通过将用户名和密码发送到后端服务器来执行用户身份验证。响应包括一个用于验证后续请求的令牌。

目前我将令牌传递给我的客户端应用程序,将其包含在后续请求中。

我现在想在epxress-session中保存这个令牌,以便随后可以隐式地在后续解析器的上下文中传递它,

但是我没有看到在解析器收到回复后如何更新request.session。

1 个答案:

答案 0 :(得分:3)

首先,通过将会话对象包含在您的上下文中,将会话对象公开给解析器。 express-graphql默认包含请求对象作为您的上下文,但我不认为Apollo服务器的中间件共享该行为 - 而是我们需要明确定义上下文。

app.use('/graphql', bodyParser.json(), (req, res, next) => {
  const context = { session:req.session }
  graphqlExpress({ schema })(req, res, next)
})

然后,在解析器中,只需将返回的标记添加到会话对象:

const loginResolver = (obj, {username, password}, context) => {
  return apiAuthCall(username, password)
    .then(token => {
      context.session.token = token
      return // whatever other data, could just be a boolean indicated whether the login was successful
    })
}