You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:50:23