Next.js创建API Routes导入fs报错 需读取UTF格式JSON输出至终端
报错原因
这个报错的核心是Node.js将当前运行的文件识别为CommonJS模块,不支持ESM规范的import语法,在Next.js场景下通常由两个问题触发:
- API路由文件存放位置错误,没有放在Next.js约定的API路由目录下,框架没有将其识别为服务端运行的接口文件,走了普通JS模块的编译逻辑
- 项目根目录
package.json中手动添加了"type": "commonjs"配置,强制所有.js文件按CommonJS规范解析,直接导致import语句无法识别
另外你当前写的读取逻辑本身也有几个问题,就算解决了import报错也无法正常运行:
- 文件路径写的
/blogdata/xxx.json是操作系统根目录的绝对路径,不是项目目录下的路径,会直接报文件不存在 - 用了回调形式的
fs.readFile,但把响应返回逻辑写在了回调外面,接口会先返回响应,读文件的异步逻辑还没执行完 - 没有做错误捕获,文件不存在、权限不足时会直接抛未处理异常
修复方案
- 先确认API路由存放位置合规
- 使用Pages Router的话,接口文件必须放在
pages/api/目录下,例如pages/api/get-blog.js - 使用App Router的话,接口文件必须命名为
route.js,存放在app/api/[你的路由段]/路径下,不能放在page.js里
- 使用Pages Router的话,接口文件必须放在
- 修正模块配置
打开项目根目录的package.json,如果存在"type": "commonjs"字段直接删除,Next.js默认会自动处理ESM和CommonJS的模块转换,不需要手动添加这个配置。 - 替换为正确的读取逻辑,推荐用
fs/promises配合async/await,代码更简洁不容易出回调问题:
import * as fs from 'node:fs/promises'; import path from 'node:path'; export default async function handler(req, res) { try { // 拼接项目根目录下的文件路径,假设blogdata文件夹直接放在项目根目录 const targetPath = path.join(process.cwd(), 'blogdata', 'how-to-learnjavascript.json'); // 以utf-8编码读取文件 const jsonContent = await fs.readFile(targetPath, 'utf-8'); // 终端打印读取到的内容 console.log('JSON文件内容:', jsonContent); // 正常返回接口响应 res.status(200).json({ name: 'John Doe', blogData: JSON.parse(jsonContent) }); } catch (error) { console.error('文件读取失败:', error); res.status(500).json({ error: '读取博客数据失败' }); } }
注意:
node:fs是Node.js服务端专属API,只能在API路由、服务端渲染函数、服务端组件里运行,不要在客户端组件里导入使用,否则也会出现模块相关的运行错误。
内容的提问来源于stack exchange,提问作者Pranshu Sati
相关产品推荐
相关产品推荐

