Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在express中为静态文件设置动态路由_Javascript_Node.js_Express - Fatal编程技术网

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

Javascript 如何在express中为静态文件设置动态路由,javascript,node.js,express,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); }); 但是,在所有条件下,这会为每个请求的路径设置相同的

目前,为了提供静态文件,我正在执行以下操作:

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

我怎样才能做到这一点?

根据您最后的评论:您仍然可以在路由器中做到这一点

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和图像等常见文件提供服务。使用
.sendFile()
方法发送不同的html文件。如果您不喜欢使用jade或ejs之类的东西,那么这就避免了必须使用渲染器。您可以通过另一种方式修改url以实现所需效果

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

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

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

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

如果您想保留随附的所有功能,那么您可以只使用monkey patch
req.url
(因为它只是一个中间件):


我也有同样的问题,现在我通过创建一个条件来修复它,就像下面的代码一样

app.use(“/”,(请求、恢复、下一步)=>{
//如果条件为false,则检查条件,然后返回
如果(1!==1)返回
//在返回所有条件之后
下一个()
},express.static(“public”))

这段代码检查1是否为非1,然后不显示文件。如果1为1,则显示所有公共文件:)

澄清——您不希望两个路径都可用于静态文件有什么原因吗?如果你想两者兼得,那也行吗?还有,你的代码有什么问题?在我看来,它似乎可以工作。如果满足您的需要,您的if/else语句就可以工作。但是,请将它放在侦听函数之外,并与其他配置一起使用。我需要它放在侦听函数内部,因为返回的静态文件会因请求而异。@dopatraman请在此处展开该用例。如果它是特定于路由的,那么这就不是解决方法,但是我在这里看不到全部情况。我正在尝试根据请求逐个呈现不同的静态html文件。这意味着,如果您和我点击相同的url,我们将看到不同的静态页面。谢谢,这非常有效,似乎是在仍然使用express.static的情况下拥有动态路由的唯一方法。
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);
});