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

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,但把响应返回逻辑写在了回调外面,接口会先返回响应,读文件的异步逻辑还没执行完
  • 没有做错误捕获,文件不存在、权限不足时会直接抛未处理异常
修复方案
  1. 先确认API路由存放位置合规
    • 使用Pages Router的话,接口文件必须放在pages/api/目录下,例如pages/api/get-blog.js
    • 使用App Router的话,接口文件必须命名为route.js,存放在app/api/[你的路由段]/路径下,不能放在page.js里
  2. 修正模块配置
    打开项目根目录的package.json,如果存在"type": "commonjs"字段直接删除,Next.js默认会自动处理ESM和CommonJS的模块转换,不需要手动添加这个配置。
  3. 替换为正确的读取逻辑,推荐用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 01:01:00