Node.js含指定请求头时输出JSON文件异常问题排查
问题分析与解决方案
核心问题
- 请求头大小写不匹配:Express会自动将所有请求头的键名转换为小写,代码中使用
headers["Battery"]无法获取到实际传入的battery头信息,导致值为undefined,最终生成空JSON对象。 - JSON结构不符合预期:当前代码直接输出
{ "battery": ... },但需求是将电池信息嵌套在info对象下。 - 异步逻辑处理不当:
saveHeadersToFile标记为async,但使用回调式的fs.writeFile,await无法等待文件写入完成,存在时序隐患。
修正后的代码
const fs = require("fs").promises; // 使用Promise版本的文件系统API const express = require("express"); const app = express(); const fileName = "request_headers.json"; const saveHeadersToFile = async (headers, fileName) => { const jsonString = JSON.stringify({ info: { battery: headers["battery"] // 改为小写头名匹配Express的规范化处理 } }, null, 2); // 添加缩进参数,让生成的JSON更易读 try { await fs.writeFile(fileName, jsonString); console.log("File written successfully"); } catch (err) { console.error(err); } }; app.get("/", async (req, res) => { const headers = req.headers; if (!headers["thing"] || headers["thing"] !== "thing") { return res.send("Invalid request"); // 给非法请求返回明确响应 } await saveHeadersToFile(headers, fileName); res.send("Request received"); }); app.listen(3000, () => { console.log("Server running on port 3000"); });
测试验证
使用原curl命令测试:
curl -H "thing: thing" -H "battery: 100" http://localhost:3000
生成的request_headers.json内容将完全符合预期:
{ "info": { "battery": "100" } }
内容的提问来源于stack exchange,提问作者fullpwn
相关产品推荐
相关产品推荐

