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

Next.js 14无服务器函数导入fs模块报错求助

解决Next.js 14无服务器函数中导入fs模块报错的问题

问题原因

Next.js 14的App Router中,API路由(无服务器函数)默认使用Edge Runtime,这个运行环境不包含Node.js核心模块fs,因此会出现Module not found: Can't resolve 'fs'的错误。

解决办法

方法一:切换到Node.js Runtime

在API路由文件的顶部添加声明,指定使用Node.js运行时,这样就能正常使用fs模块:

export const runtime = 'nodejs'; // 明确指定Node.js运行时

import fs from "fs";
import path from 'path';

export async function POST(req: Request) {
  // process.cwd() 返回项目根目录,直接拼接src路径即可
  const promptTemplate = fs.readFileSync(path.join(process.cwd(), "src/prompt.txt"), "utf8");
  console.log("promptTemplate", promptTemplate);
  // ... 后续逻辑
}

注意:原代码中的../../src/prompt.txt路径可以简化,因为process.cwd()已经指向项目根目录,无需向上跳转层级。

如果偏好异步操作,推荐使用fs/promises:

export const runtime = 'nodejs';

import fs from "fs/promises";
import path from 'path';

export async function POST(req: Request) {
  const promptTemplate = await fs.readFile(path.join(process.cwd(), "src/prompt.txt"), "utf8");
  console.log("promptTemplate", promptTemplate);
  // ... 后续逻辑
}

方法二:保留Edge Runtime的替代方案

如果必须使用Edge Runtime(比如需要边缘部署的特性),可以将prompt.txt放到项目的public目录下,通过fetch读取文件内容:

export async function POST(req: Request) {
  // 拼接文件的公开访问路径
  const fileUrl = new URL('/prompt.txt', process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000');
  const res = await fetch(fileUrl);
  const promptTemplate = await res.text();
  console.log("promptTemplate", promptTemplate);
  // ... 后续逻辑
}

注意:这种方式下文件会被公开访问,若prompt.txt包含敏感内容,不建议使用此方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:29:59