javascript - Apollo 服务器设置多个“set-cookie”标头作为响应
问题描述
我将 apollo-server-express 与 apollo-rest-datasources 一起使用。我正在尝试从方法将多个set-cookie
标头作为响应标头返回给我的客户端formatResponse
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);
});
这是我的上下文对象
context: ({ req, res }) => {
return {
response: {
headers: {
'set-cookie': ['key1=value1', 'key2=value2']
},
},
res,
};
},
我得到的最终响应是这种形式
set-cookie: key1=value1, key2=value2
的,浏览器无法识别要设置 2 个 cookie,它只是key1=value1
在 cookie 中设置。
解决方案
我使用res
传入 apollo 服务器上下文的 express 来设置多个 cookie。例如
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}`));
从浏览器获取响应头:
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
通过以下方式获取 cookie document.cookie
:
document.cookie
"key1=value1; key2=value2"
源代码:https ://github.com/mrdulin/apollo-graphql-tutorial/tree/master/src/stackoverflow/61183199
推荐阅读
- autowired - Symfony 3.4:如何将服务注入实体监听器?
- javascript - 如果 JavaScript 中一个函数有多个函数定义,为什么最后一个实现会优先?
- unity3d - StaticVar 分数在 HTML5 WebGL 中不起作用
- node.js - 集成 Billdesk 支付网关时出现无效的商家详细信息 (ERRP004) 错误
- macos - 为什么 macOS“Big Sur”上终端中的 ksh 的 vi 模式有时会损坏编辑行?
- audio - ffmpeg 在开始和结束之前将广告音频文件添加到原始音频文件
- angular - 在服务中使用 FormArray 时的 OnPush 更改检测
- highcharts - 我可以用哪个图表来制作这个?来自highcharts
- pdf - 使用 Camelot 合并跨多个页面的表
- web3js - 如何使用 web3.js(BSC 测试网络)发送带有元掩码的 BNB