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

如何通过前缀配置__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);

进阶:拆分路由文件让代码更整洁

如果路由多了,把不同用户的路由拆成单独文件会更好维护:

  1. 创建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;
  1. 创建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;
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:43:28