使用Express路由HTML页面时遇错误:res.sendFile路径问题
解决Express中res.sendFile的"path must be absolute or specify root"错误
这个错误的核心原因很明确:res.sendFile() 要求你传入的文件路径必须是绝对路径,或者通过 root 参数明确告诉Express去哪里找这个文件。你的代码里直接传'sponsors'这种相对路径,Express根本不知道该从哪个目录开始查找,自然会抛出错误。另外还有个小细节:你没加.html后缀,Express也没法识别你要访问的是HTML文件。
结合你的文件结构(root/public下存放所有HTML文件),给你两种可行的修正方案:
方案1:用path模块拼接绝对路径
利用Node.js的path模块,把当前脚本目录(__dirname)、public文件夹和目标文件名拼接成绝对路径,这样Express就能精准定位文件了:
var express = require("express") var app = express() const port = 3000 const path = require('path') // 保留静态文件服务,用于加载css、images等资源 app.use(express.static(__dirname + '/public')); app.get('/sponsors', function(req, res) { // 拼接绝对路径并加上.html后缀 res.sendFile(path.join(__dirname, 'public', 'sponsors.html')) }) app.get('/', function(req, res) { res.sendFile(path.join(__dirname, 'public', 'index.html')) }) app.get('/team', function(req, res) { res.sendFile(path.join(__dirname, 'public', 'team.html')) }) app.listen(port, () => console.log(`Example app listening on port ${port}!`))
方案2:指定root参数
如果你不想每次都拼接绝对路径,可以给res.sendFile()传入root选项,指定文件所在的根目录,这样只需要传相对root的文件名即可:
var express = require("express") var app = express() const port = 3000 const path = require('path') const publicRoot = path.join(__dirname, 'public') app.use(express.static(publicRoot)); app.get('/sponsors', function(req, res) { res.sendFile('sponsors.html', { root: publicRoot }) }) app.get('/', function(req, res) { res.sendFile('index.html', { root: publicRoot }) }) app.get('/team', function(req, res) { res.sendFile('team.html', { root: publicRoot }) }) app.listen(port, () => console.log(`Example app listening on port ${port}!`))
额外说明:关于view engine的配置
你代码里写了app.set("view engine", "html"),但其实这个配置是给res.render()用的——如果你想用模板引擎渲染HTML(比如EJS、Pug),才需要设置view engine。如果只是单纯返回静态HTML文件,用res.sendFile()就够了,这个配置可以删掉。
如果之后你想改用res.render(),需要把HTML文件放到views目录下(Express默认约定),然后安装对应的模板引擎(比如ejs,因为Express本身不支持直接渲染HTML作为模板),再配置:
app.set('views', path.join(__dirname, 'views')); // 指定视图目录 app.set('view engine', 'ejs'); // 然后把.html文件改成.ejs,用res.render('index')来渲染
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

