有可能吗?我想设置两个不同的目录来提供静态文件。让我们说/ public和/ mnt
答案 0 :(得分:139)
您还可以通过指定use()
的附加(第一个)参数来设置将静态文件提供给网络的路径,如下所示:
app.use("/public", express.static(__dirname + "/public"));
app.use("/public2", express.static(__dirname + "/public2"));
通过这种方式,您可以在Web上获得镜像本地目录的两个不同目录,而不是一个在两个本地目录之间进行故障转移的URL路径。
换句话说,网址格式:
http://your.server.com/public/*
提供来自本地目录public
的文件,同时:
http://your.server.com/public2/*
提供本地目录public2
中的文件。
顺便说一句,如果您不希望静态服务器从服务器的根目录提供文件,而是从更合格的路径提供文件,这也很有用。
HTH
答案 1 :(得分:49)
您还可以将目录“合并”到一个可见目录
目录结构
/static
/alternate_static
<强>代码强>
app.use("/static", express.static(__dirname + "/static"));
app.use("/static", express.static(__dirname + "/alternate_static"));
static和alternate_static都将被视为位于同一目录中。但请注意文件名clobbers。
答案 2 :(得分:40)
一次中间件注入是不可能的,但您可以多次注入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来说是实际的,但是多个静态中间件的使用仍然像以前一样。
答案 3 :(得分:2)
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
答案 4 :(得分:0)
使用:dir
代替*
例如
this.app.use('/:microsite', express.static(path.resolve(process.cwd(), 'client/')))
答案 5 :(得分:0)
在长时间搜寻此任务后,我也遇到了同样的问题,但我设法解决了这个问题。
步骤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>
需要通过更改以下内容以显示mnt文件夹内容来修改index.html,
<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步:
在一种途径中,您可以为公众服务,而在另一种途径中,您可以为企业服务。
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'));
})
现在你很好。运行并测试。