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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:44:56