繁体   English   中英

Apollo 服务器设置多个 `set-cookie` header 作为响应

[英]Apollo server set multiple `set-cookie` header in response

我将 apollo-server-express 与 apollo-rest-datasources 一起使用。 我正在尝试从formatResponse方法返回多个set-cookie header 以响应 header 给我的客户

set-cookie: key1=value1
set-cookie: key2=value2

但是每当我传入数组时,它只会将其字符串化并以逗号分隔这是我的formatResponse方法

formatResponse: (response, requestContext) => {
    Object.entries(requestContext.context.response.headers).forEach(([key, value]) => {
        requestContext.response.http.headers.set(key, value);
    });

这是我的上下文 object

context: ({ req, res }) => {
    return {
      response: {
        headers: {
           'set-cookie': ['key1=value1', 'key2=value2']
       },
      },
      res,
    };
  },

我得到的最终响应是这种形式set-cookie: key1=value1, key2=value2并且浏览器无法识别有 2 个 cookies 要设置,它只是在 cookies 中设置key1=value1

我使用传递到阿波罗服务器上下文的 express res来设置多个 cookies。 例如

import { ApolloServer, gql } from 'apollo-server-express';
import express from 'express';

const typeDefs = gql`
  type Query {
    dummy: String!
  }
`;
const resolvers = {
  Query: {
    dummy: () => 'hello world',
  },
};

const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req, res }) => {
    return {
      response: {
        headers: {
          'set-cookie': ['key1=value1', 'key2=value2'],
        },
      },
      res,
    };
  },
  formatResponse: (response, requestContext: any) => {
    // not working
    // requestContext.response!.http!.headers.set('set-cookie', 'key1=value1');
    // requestContext.response!.http!.headers.set('set-cookie', 'key2=value2');
    // works fine
    requestContext.context.res.set('set-cookie', ['key1=value1', 'key2=value2']);
    return response!;
  },
});
const app = express();
server.applyMiddleware({ app });

app.get('/', (req, res) => {
  res.sendFile('index.html', { root: __dirname });
});

app.listen({ port: 4000 }, () => console.log(`🚀 Server ready at http://localhost:4000${server.graphqlPath}`));

从浏览器获取响应 header:

HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
set-cookie: key1=value1
set-cookie: key2=value2
Content-Type: application/json; charset=utf-8
Content-Length: 33
ETag: W/"21-wOMEaw/ExA+LOH3PCuP0vilR+4w"
Date: Wed, 22 Apr 2020 05:30:20 GMT
Connection: keep-alive

通过document.cookie获取 cookies :

document.cookie
"key1=value1; key2=value2"

在此处输入图像描述

源代码: https://github.com/mrdulin/apollo-graphql-tutorial/tree/master/src/stackoverflow/61183199

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM