如何通过前缀配置__dirname访问两类用户的public目录路由
如何通过__dirname结合路由前缀访问不同的public/views文件夹
嘿,我来帮你搞定这个问题!要区分两类用户的public/views文件夹,用__dirname配合路由前缀其实很简单,尤其是在Node.js(比如用Express框架)的场景下。我先结合常见的目录结构给你一步步说明,你可以根据自己的实际目录调整路径。
先明确目录结构(假设你的项目是这样)
要是你的实际目录和下面不一样,只需要对应修改路径拼接部分就行:
你的项目根目录/ ├── public_customer/ # 普通用户专属的静态资源文件夹 │ └── views/ │ ├── home.html │ └── order.html ├── public_admin/ # 管理员专属的静态资源文件夹 │ └── views/ │ ├── dashboard.html │ └── user_list.html └── app.js # Node.js入口文件
场景1:直接提供静态页面访问(比如HTML文件)
如果你的views里是纯静态HTML文件,用Express的express.static中间件就能轻松实现前缀区分,结合__dirname精准定位文件夹:
const express = require('express'); const path = require('path'); // 用path模块更安全,自动适配不同系统的路径分隔符 const app = express(); // 普通用户路由:前缀 /customer,对应public_customer/views app.use('/customer', express.static(path.join(__dirname, 'public_customer/views'))); // 管理员路由:前缀 /admin,对应public_admin/views app.use('/admin', express.static(path.join(__dirname, 'public_admin/views'))); app.listen(3000, () => { console.log('服务器跑在3000端口啦!'); });
这样一来:
- 访问
http://localhost:3000/customer/home.html会加载public_customer/views/home.html - 访问
http://localhost:3000/admin/dashboard.html会加载public_admin/views/dashboard.html
__dirname在这里代表当前执行文件(app.js)所在的项目根目录,配合path.join()拼接路径,比直接用字符串相加更靠谱,不会因为操作系统差异出问题。
场景2:用模板引擎渲染动态视图(比如EJS、Pug)
如果你的views里是模板文件(需要动态渲染数据),可以通过路由中间件临时切换视图目录,结合前缀区分用户类型:
步骤1:先安装模板引擎(以EJS为例)
npm install ejs
步骤2:在app.js里配置路由和视图切换
const express = require('express'); const path = require('path'); const app = express(); // 全局设置模板引擎为EJS app.set('view engine', 'ejs'); // 普通用户路由组:前缀 /customer app.use('/customer', (req, res, next) => { // 临时把视图目录切换到普通用户的views文件夹 app.set('views', path.join(__dirname, 'public_customer/views')); next(); // 继续执行后续路由逻辑 }); // 普通用户的具体页面路由 app.get('/customer/home', (req, res) => { res.render('home', { userType: '普通用户' }); // 渲染public_customer/views/home.ejs }); // 管理员路由组:前缀 /admin app.use('/admin', (req, res, next) => { app.set('views', path.join(__dirname, 'public_admin/views')); next(); }); // 管理员的具体页面路由 app.get('/admin/dashboard', (req, res) => { res.render('dashboard', { userType: '管理员' }); // 渲染public_admin/views/dashboard.ejs }); app.listen(3000);
进阶:拆分路由文件让代码更整洁
如果路由多了,把不同用户的路由拆成单独文件会更好维护:
- 创建
routes/customer.js:
const express = require('express'); const router = express.Router(); const path = require('path'); // 本路由组内统一设置视图目录 router.use((req, res, next) => { req.app.set('views', path.join(__dirname, '../public_customer/views')); next(); }); router.get('/home', (req, res) => { res.render('home'); }); module.exports = router;
- 创建
routes/admin.js:
const express = require('express'); const router = express.Router(); const path = require('path'); router.use((req, res, next) => { req.app.set('views', path.join(__dirname, '../public_admin/views')); next(); }); router.get('/dashboard', (req, res) => { res.render('dashboard'); }); module.exports = router;
- 在
app.js引入路由:
const express = require('express'); const app = express(); const customerRoutes = require('./routes/customer'); const adminRoutes = require('./routes/admin'); app.set('view engine', 'ejs'); app.use('/customer', customerRoutes); app.use('/admin', adminRoutes); app.listen(3000);
几个小提醒
- 始终用
path.join()拼接路径,别直接用+,避免Windows和Linux/macOS的路径分隔符冲突 - 如果你的
public文件夹在子目录里(比如src下),只需要调整路径:path.join(__dirname, 'src/public_customer/views') - 静态文件场景优先用
express.static,Express会自动处理缓存等优化,比手动路由渲染更高效
内容的提问来源于stack exchange,提问作者user9445158
相关产品推荐
相关产品推荐

