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
相关产品推荐
相关产品推荐

