Nodejs Express 能不能动态改变 Static 的目录?
Nodejs Express 能不能动态改变 Static 的目录?
比如我想将 app.use(express.static(path.join(__dirname, ‘/public’)));
根据访问的二级域名,定位到对应目录
app.use(express.static(path.join(__dirname, ‘/’+domain+’/public’)));
Nodejs Express 能不能动态改变 Static 的目录?
在使用 Node.js 和 Express 框架时,我们经常需要提供静态文件服务。默认情况下,express.static
中间件用于指定一个固定的目录来提供静态文件。然而,有时我们希望根据不同的条件(如二级域名)来动态改变静态文件的目录。下面将展示如何实现这一点。
示例代码
首先,确保你已经安装了 express
和 path
模块:
npm install express
接下来,创建一个简单的 Express 应用程序,并根据二级域名动态设置静态文件目录:
const express = require('express');
const path = require('path');
const app = express();
// 假设我们有两个二级域名:sub1 和 sub2
app.get('*', (req, res, next) => {
const domainParts = req.hostname.split('.');
if (domainParts.length > 2) {
const subDomain = domainParts[0];
// 动态设置静态文件目录
let staticDir;
switch (subDomain) {
case 'sub1':
staticDir = path.join(__dirname, '/sub1/public');
break;
case 'sub2':
staticDir = path.join(__dirname, '/sub2/public');
break;
default:
staticDir = path.join(__dirname, '/default/public');
break;
}
// 使用 express.static 提供静态文件服务
app.use(express.static(staticDir));
}
next();
});
// 其他路由和中间件
app.get('/', (req, res) => {
res.send('Hello World!');
});
// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
解释
- 获取二级域名:通过解析请求的
hostname
获取二级域名。 - 动态设置目录:根据二级域名选择相应的静态文件目录。
- 使用 express.static:使用
express.static
中间件为每个二级域名提供静态文件服务。
这样,当用户访问不同的二级域名时,Express 将会从相应的目录中提供静态文件。这种方式提供了灵活性,使得可以根据不同条件动态地更改静态文件的目录。
express.static不过是connect提供的一个middleware,你可以依样画胡芦写个自己的, 改动应该不超过3行。
搞定了,多谢
app.use("/public", express.static(__dirname + “/public”)); app.use("/public2", express.static(__dirname + “/public2”));
可以使用中间件动态改变 express.static
的目录。你可以根据请求中的信息(如二级域名、路径等)来决定使用哪个目录。
以下是一个示例代码,展示了如何根据二级域名来动态设置静态文件目录:
const express = require('express');
const path = require('path');
const app = express();
// 示例二级域名处理函数
function getPublicDirectory(req) {
const domainParts = req.hostname.split('.');
if (domainParts.length > 2) {
const subdomain = domainParts[0];
return path.join(__dirname, subdomain, 'public');
}
return path.join(__dirname, 'default', 'public');
}
app.use((req, res, next) => {
const publicDir = getPublicDirectory(req);
app.use(express.static(publicDir));
next();
});
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
- getPublicDirectory 函数:根据请求的主机名(即二级域名)返回对应的公共目录路径。
- 中间件:在应用其他路由之前,使用一个中间件来动态设置
express.static
的目录。 - next():调用
next()
来确保请求继续传递到下一个中间件或路由处理器。
通过这种方式,你可以根据不同的二级域名动态地为静态资源提供不同的目录。