Express+Node.js项目部署Vercel时fs读取EJS文件报ENOENT错误如何解决
问题原因
这个报错是Vercel Serverless运行环境的路径寻址规则和资源打包规则和本地开发环境不一致导致的,核心有两个触发点:
- 相对路径寻址失效:Vercel函数运行时的工作目录不是你的项目根目录,直接用
./开头的相对路径找不到对应视图文件 - 静态资源未被打包:Vercel默认打包Node.js函数时只会包含JS执行依赖,你的
views目录不属于代码依赖会被默认剔除,即使路径对了也找不到文件
排查步骤
- 先在
fs.readFile执行前添加日志打印当前运行环境的路径信息,部署后查看Vercel函数日志确认路径错位情况:
console.log('当前工作目录:', process.cwd()) console.log('目标文件是否存在:', fs.existsSync('./views/index/index.ejs'))
- 检查项目根目录是否有正确的
vercel.json配置文件,是否配置了资源包含规则
解决方法
1. 修正文件路径写法
所有涉及fs读取文件的路径全部替换为基于__dirname的绝对路径,你也可以直接用ejs内置的render方法简化代码,避免手动读文件出错:
修改后的index.js代码如下:
const express = require("express"); const app = express(); const ejs = require('ejs'); const port = 5000; const fs = require('fs') const path = require('path') // 配置静态文件和模板引擎 app.use(express.static('public')) app.set('view engine' , 'ejs') // 配置视图目录的绝对路径,确保ejs能正确找到文件 app.set('views', path.join(__dirname, 'views')) app.get('/', (req, res) => { // 直接用render方法,不需要手动读ejs文件 res.render('index/index') // 如果坚持要手动读文件,用下面的写法 // fs.readFile(path.join(__dirname, './views/index/index.ejs') ,(err,data)=> { // if(err){ // throw err // } // res.end(data) // }) }); // 本地开发监听端口,Vercel环境不需要手动监听 if (process.env.NODE_ENV === 'development') { app.listen(port, () => { console.log(`Server is booming on port 5000 Visit http://localhost:5000`); }); } module.exports = app
2. 配置Vercel打包规则
在项目根目录新建vercel.json文件,告诉Vercel打包时要包含views和public目录:
{ "version": 2, "builds": [ { "src": "index.js", "use": "@vercel/node", "config": { "includeFiles": [ "views/**", "public/**" ] } } ], "routes": [ { "src": "/(.*)", "dest": "index.js" } ] }
修改完成后重新部署即可解决报错问题。
内容的提问来源于stack exchange,提问作者udhay r
相关产品推荐
相关产品推荐

