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

Next.js 13中JSON.parse返回字符串而非对象的原因及解决方法

问题

在Next.js 13的API路由中编写代码,从文件读取JSON内容后用JSON.parse解析,预期得到对象类型的dbJson,但控制台打印typeof dbJson显示为字符串,修改属性时抛出错误:TypeError: Cannot create property 'printResume' on string。

代码如下:

export async function POST(req: Request) {
  const data = (await req.json()) as { type: "print" | "view" | "save" };
  let db = await ReadDb();
  let dbJson = JSON.parse(db) as dbSchema;
  console.log(typeof dbJson);
  if (data.type === "print") {
    dbJson.printResume = dbJson.printResume + 1;
  } else if (data.type === "save") {
    dbJson.savePdf = dbJson.savePdf + 1;
  } else if (data.type === "view") {
    dbJson.pageView = dbJson.pageView + 1;
  }
  SaveDb(dbJson);
  return NextResponse.json({ status: "Ok" });
}
async function ReadDb() {
  const jsonDirectory = path.join(process.cwd(), "json");
  const db = await fs.readFile(process.cwd() + "/public/db.json", "utf-8");

  return db;
}
async function SaveDb(newDb: dbSchema) {
  const db = await fs.writeFile(
    process.cwd() + "/public/db.json",
    JSON.stringify(newDb)
  );
}

控制台输出:

string
- error TypeError: Cannot create property 'printResume' on string '{"pageView":0,"printResume":0,"savePdf":0}'
    at POST (webpack-internal:///(sc_server)/./app/api/views/route.ts:26:28)
    at async eval (webpack-internal:///(sc_server)/./node_modules/next/dist/server/future/route-modules/app-route/module.js:242:37)
原因分析

核心问题是**db.json文件中的内容被双重JSON序列化了**:文件里存的不是原始的JSON对象,而是一个被字符串包裹、转义后的JSON内容。比如实际内容是"{\"pageView\":0,\"printResume\":0,\"savePdf\":0}",而非直接的{"pageView":0,"printResume":0,"savePdf":0}。

当执行一次JSON.parse(db)时,解析结果仍是字符串,所以typeof dbJson显示为string,自然无法给字符串添加属性。

解决方法

有两种修复方式,优先选择第一种:

方式一:修复文件内容(推荐)

直接打开public/db.json文件,将内容修改为原始JSON对象格式,去掉外层的引号和转义符,最终内容应为:

{"pageView":0,"printResume":0,"savePdf":0}

修改后,一次JSON.parse(db)就能正确解析出对象。

方式二:双重解析(临时 workaround)

如果暂时无法修改文件内容,可以对读取到的内容执行两次JSON.parse:

let dbJson = JSON.parse(JSON.parse(db)) as dbSchema;

但这种方式只是临时解决,长期来看建议修复文件本身,避免后续出现其他序列化问题。

额外优化点

  • ReadDb函数中定义的jsonDirectory未被使用,可删除冗余代码;
  • fs.writeFile无返回值,无需用await接收(或改用fs.promises.writeFile确保异步处理规范)。

内容的提问来源于stack exchange,提问作者Pradeep Bisht

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:04:56