NodeJS中如何将event.headers转换为小写以适配AWS?
解决Event Headers键转换为小写的问题
我来帮你修正代码里的问题,先拆解下你之前的实现哪里出了错,再给出可行的解决方案:
原代码的问题分析
- 你自己写的
makeLower函数没有返回值,所以执行const headers = makeLower(event.headers)后,headers会是undefined,自然无法读取headers['content-type'] - 函数内部的赋值逻辑完全错了:
event.headers[key] = key.toLowerCase()是把原header的值改成了键的小写字符串,而不是创建一个键为小写的新条目
正确的实现方式
你参考的那个思路是对的,只需要调整代码写法,确保正确生成转换后的headers对象:
修正后的index.js代码
// 正确的转换函数:将headers的键全部转为小写 function makeLower(headers) { const lowerCaseHeaders = {}; for (const key in headers) { // 把原键转小写作为新键,保留原对应的值 lowerCaseHeaders[key.toLowerCase()] = headers[key]; } return lowerCaseHeaders; } // 使用转换后的headers const headers = makeLower(event.headers); // 或者直接替换event.headers,后续代码都用event.headers即可 // event.headers = makeLower(event.headers); console.log('HEADERS: ' + headers['content-type']);
如果你习惯更简洁的写法(ES2019及以上版本支持),可以用Object.fromEntries实现:
const headers = Object.fromEntries( Object.entries(event.headers).map(([key, value]) => [key.toLowerCase(), value]) );
测试用例调整
你的测试用例现在传入的是小写键的headers,应该改成传入大写/混合大小写的键,才能验证转换逻辑是否生效:
it('should still return 202, with uppercase headers > converting them to lower', done => { // 传入大写键的headers,验证转换逻辑 event.headers = {'Content-Type': 'application/json', 'X-Custom-Header': 'test'}; lambda.handler(event, null, (err, request) => { should.not.exist(err); should.exist(request); // 额外断言转换后的headers是否正确 const processedHeaders = makeLower(event.headers); should.equal(processedHeaders['content-type'], 'application/json'); should.equal(processedHeaders['x-custom-header'], 'test'); done(); }); })
这样调整后,不管原headers的键是大写还是混合大小写,都能统一转换成小写键,避免AWS相关的报错。
内容的提问来源于stack exchange,提问作者physicsboy
相关产品推荐
相关产品推荐

