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