可能吗?我想设置两个不同的目录来提供静态文件。假设 /public 和 /mnt
7 回答
您还可以通过指定附加(第一个)参数来设置将静态文件提供给 Web 的路径,use()
如下所示:
app.use("/public", express.static(__dirname + "/public"));
app.use("/public2", express.static(__dirname + "/public2"));
这样,您将在 Web 上获得两个不同的目录来镜像您的本地目录,而不是在两个本地目录之间进行故障转移的一个 url 路径。
换句话说,URL 模式:
http://your.server.com/public/*
提供本地目录中的文件,public
同时:
http://your.server.com/public2/*
提供本地目录中的文件public2
。
顺便说一句,如果您不希望 static 从服务器的根目录提供文件,而是从更合格的路径提供文件,这也很有用。
高温高压
您还可以将目录“合并”到单个可见目录中
目录结构
/static
/alternate_static
代码
app.use("/static", express.static(__dirname + "/static"));
app.use("/static", express.static(__dirname + "/alternate_static"));
static 和alternate_static 都将被视为在同一个目录中。不过,请注意文件名破坏者。
一次中间件注入是不可能的,但您可以static
多次注入中间件:
app.configure('development', function(){
app.use(express.static(__dirname + '/public1'));
app.use(express.static(__dirname + '/public2'));
});
解释
查看connect/lib/middleware/static.js#143:
path = normalize(join(root, path));
有一个options.root
静态根,您可以在其中定义express.static
或connect.static
调用它,并且path
是请求路径。
更多地查看connect/lib/middleware/static.js#154:
fs.stat(path, function(err, stat){
// ignore ENOENT
if (err) {
if (fn) return fn(err);
return ('ENOENT' == err.code || 'ENAMETOOLONG' == err.code)
? next()
: next(err);
路径只检查一次,如果找不到文件,则请求传递给下一个中间件。
Connect 2.x 更新
Connect 2.x 的代码链接是不实际的,但仍然可以像以前一样使用多个静态中间件。
const express = require('express');
const path = require('path');
const pagesPath = path.join(__dirname, '/cheatsheet');
const cssPath = path.join(__dirname, '/stylesheet');
const port = process.env.PORT || 3000;
var app = express();
app.use("/cheatsheet" ,express.static(pagesPath));
app.use("/stylesheet",express.static(cssPath));
app.get('/',(request,response)=>{
response.send('Hello CSS!!!');
});
app.get('/bad',(request,response)=>{
response.send({error: 'Bad Request'});
});
app.listen(port, ()=> {
console.log(`Server is running on Port ${port}` );
console.log(__dirname);
});
// folder structure
/cheatsheet/index.html
/stylesheet/style.css
我也遇到了同样的问题,但经过长时间的搜索,我设法解决了这个问题。
步骤1:
在 /public 和 /mnt 的路径名中提供静态文件
app.use('/public', express.static(path.join(__dirname, '<path_to_the_folder_you_want_to_serve_public>')));
app.use('/mnt', express.static(path.join(__dirname, '<path_to_the_folder_you_want_to_serve_mnt>')));
第2步:
我的计划是在单个 NodeJS 服务器中部署两个 Angular 客户端应用程序。
所以我在两个 Angular 客户端应用程序上运行了“ng build” 。
我将一个 dist 文件夹放在“/public”文件夹中,另一个 dist 文件夹放在“/mnt”中。
第 3 步:
需要通过更改以下内容来修改 index.html 以显示公用文件夹内容,
<script src="./public/runtime.js" defer></script>
<script src="./public/polyfills.js" defer></script>
<script src="./public/styles.js" defer></script>
<script src="./public/vendor.js" defer></script>
<script src="./public/main.js" defer></script>
需要修改 index.html 通过更改以下内容来显示 mnt 文件夹内容,
<script src="./mnt/runtime.js" defer></script>
<script src="./mnt/polyfills.js" defer></script>
<script src="./mnt/styles.js" defer></script>
<script src="./mnt/vendor.js" defer></script>
<script src="./mnt/main.js" defer></script>
重要提示:根据静态文件夹服务路径更改 .js 文件路径。
第4步:
在一条道路上,您可以为公共服务,而在另一条道路上,您可以为 mnt 服务。
app.get('/', function(req, res) => {
res.sendFile(path.join(__dirname, '../public/dist/index.html'));
})
app.get('/', function(req, res) => {
res.sendFile(path.join(__dirname, '../mnt/dist/index.html'));
})
现在你可以走了。运行并测试它。
要express.static
在自定义中间件中使用:
app.use(customMiddleware())
在哪里
const customMiddleware = function() {
return function(req, res, next) {
// do some dynamic code
// or
return express.static(__dirname + "/public")(req, res, next);
}
}
使用:dir
而不是*
例如
this.app.use('/:microsite', express.static(path.resolve(process.cwd(), 'client/')))