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

