Node(Express).js路由问题:首页路由正常,登录路由无法访问
问题分析与解决方案
问题原因
你的res.sendFile使用了相对路径,但Express中sendFile的相对路径基准是Node进程的启动目录,而非路由文件所在的目录。
假设你的项目结构如下:
project-root/ ├── app.js ├── routes/ │ ├── index.js │ └── login.js └── views/ ├── index.html └── login.html
当你在项目根目录启动app.js时,进程工作目录为project-root/:
index.js中的../views/index.html实际解析为project-root/../views/index.html,这显然是错误路径,但你提到首页能正常访问,大概率是启动目录恰好为routes/,属于巧合;login.js中的../views/login.html同样基于进程启动目录解析,一旦启动目录不是routes/,就会出现文件找不到的情况,导致路由无法正常响应。
解决方案
使用Node内置的path模块结合__dirname拼接绝对路径,__dirname代表当前模块文件所在的目录,能确保路径解析不受进程启动目录影响:
修改login.js代码:
var express = require('express'); var router = express.Router(); var path = require('path'); // 引入path模块 router.get('/', function(req, res, next) { // 拼接绝对路径 res.sendFile(path.join(__dirname, '../views/login.html')); }); module.exports = router;
同时,建议把index.js也改为绝对路径写法,避免后续出现类似问题:
var express = require('express'); var router = express.Router(); var path = require('path'); /* GET home page. */ router.get('/', function(req, res, next) { res.sendFile(path.join(__dirname, '../views/index.html')); }); module.exports = router;
修改后,无论从哪个目录启动Node进程,sendFile都能精准定位到HTML文件,路由即可正常生效。
内容的提问来源于stack exchange,提问作者Fererra_
相关产品推荐
相关产品推荐

