Nodejs Express 能不能动态改变 Static 的目录?

Nodejs Express 能不能动态改变 Static 的目录?

比如我想将 app.use(express.static(path.join(__dirname, ‘/public’)));

根据访问的二级域名,定位到对应目录

app.use(express.static(path.join(__dirname, ‘/’+domain+’/public’)));

5 回复

Nodejs Express 能不能动态改变 Static 的目录?

在使用 Node.js 和 Express 框架时,我们经常需要提供静态文件服务。默认情况下,express.static 中间件用于指定一个固定的目录来提供静态文件。然而,有时我们希望根据不同的条件(如二级域名)来动态改变静态文件的目录。下面将展示如何实现这一点。

示例代码

首先,确保你已经安装了 expresspath 模块:

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}`);
});

解释

  1. 获取二级域名:通过解析请求的 hostname 获取二级域名。
  2. 动态设置目录:根据二级域名选择相应的静态文件目录。
  3. 使用 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');
});

解释

  1. getPublicDirectory 函数:根据请求的主机名(即二级域名)返回对应的公共目录路径。
  2. 中间件:在应用其他路由之前,使用一个中间件来动态设置 express.static 的目录。
  3. next():调用 next() 来确保请求继续传递到下一个中间件或路由处理器。

通过这种方式,你可以根据不同的二级域名动态地为静态资源提供不同的目录。

回到顶部