110

可能吗?我想设置两个不同的目录来提供静态文件。假设 /public 和 /mnt

4

7 回答 7

166

您还可以通过指定附加(第一个)参数来设置将静态文件提供给 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 从服务器的根目录提供文件,而是从更合格的路径提供文件,这也很有用。

高温高压

于 2012-09-28T22:51:38.917 回答
59

您还可以将目录“合并”到单个可见目录中

目录结构

  • /static
  • /alternate_static

代码

app.use("/static", express.static(__dirname + "/static"));
app.use("/static", express.static(__dirname + "/alternate_static"));

static 和alternate_static 都将被视为在同一个目录中。不过,请注意文件名破坏者。

于 2013-02-12T19:34:08.277 回答
42

一次中间件注入是不可能的,但您可以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.staticconnect.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 的代码链接是不实际的,但仍然可以像以前一样使用多个静态中间件。

于 2011-05-12T10:23:53.960 回答
1
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
于 2018-09-26T21:45:11.780 回答
1

我也遇到了同样的问题,但经过长时间的搜索,我设法解决了这个问题。

步骤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'));
})

现在你可以走了。运行并测试它。

于 2020-11-23T14:04:45.517 回答
0

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);
    }
}
于 2022-02-28T11:58:19.697 回答
-1

使用:dir而不是*

例如

this.app.use('/:microsite', express.static(path.resolve(process.cwd(), 'client/')))
于 2020-10-29T14:30:06.437 回答