如何为express中的静态文件设置动态路由

时间:2015-09-12 23:35:28

标签: javascript node.js express

目前,为了提供静态文件我做这样的事情:

app.use('/', express.static(__dirname + '/public/'));
// then i start the server
http.createServer(app).listen(port, function() {
    console.log('HTTP Express server listening on port %s', port);
});

但是,在所有条件下,这会为每个请求设置该路径的相同目录。我想做的是这样的事情会改变请求的响应请求:

http.createServer(app).listen(port, function() {
    if (someCondition) {
        app.use('/', express.static(__dirname + '/public/'));
    }
    else {
        app.use('/', express.static(__dirname + '/public/someotherpath'));    
    }
    console.log('HTTP Express server listening on port %s', port);
});

我该怎么做?

5 个答案:

答案 0 :(得分:2)

你可以通过另一种方式修改网址以达到你想要的效果

app.use('/', function(req,res,next){
    if(condition){
        req.url = newURL // add something to lead to different directory
    }
    next();
});

app.use('/', express.static(__dirname + '/public/'));
// then i start the server
http.createServer(app).listen(port, function() {
    console.log('HTTP Express server listening on port %s', port);
});

答案 1 :(得分:1)

express.static()的结果是一个中间件函数,因此您可以根据条件动态调用它。

app.get('/', (req, res, next) => {
    if (condition) {
        express.static(__dirname + '/public/')(req, res, next);
    } else {
        express.static(__dirname + '/public/someotherpath')(req, res, next);
    }
});

答案 2 :(得分:0)

根据您的上一条评论:您仍然可以在路由器中执行此操作

app.get('/somepath', function(req, res){
    if(req.someCondition){
      res.sendFile('./path/to/appropriate/file.html');
    } else {
      res.sendFile('./path/to/different/file.html');
    }
}

express.static为您的公共文件提供服务,例如js,css和images。使用.sendFile()方法发送不同的html文件。如果您不想使用jade或ejs

之类的东西,这可以避免使用渲染器

答案 3 :(得分:0)

老问题...但这是一个快速解决方案...

如果您想保留express.static随附的所有功能,则可以猴子补丁req.url(因为它只是中间件):

const path = require('path');
const express = require('express');
const app = express();

// Dynamic path, but only match asset at specific segment.
app.use('/website/:foo/:bar/:asset', (req, res, next) => {
  req.url = req.params.asset;
  express.static(__dirname + '/static')(req, res, next);
});         

// Just the asset.
app.use('/website/*', (req, res, next) => {
  req.url = path.basename(req.originalUrl);
  express.static(__dirname + '/static')(req, res, next);
});

答案 4 :(得分:0)

我也遇到了同样的问题,现在我通过创建一个类似于下面代码的条件来解决它

app.use("/", (req, res, next) => {
  //check a condition if its false then return
  if(1 !== 1)return
  //After returned all conditions
  next()
}, express.static("public"))

此代码检查 1 是否不是 1,如果 1 是 1,则不会显示文件,然后它会显示所有公共文件:)