在node.js Express框架中设置两个不同的静态目录

时间:2011-05-12 04:53:58

标签: static node.js express duostack

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

6 个答案:

答案 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.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来说是实际的,但是多个静态中间件的使用仍然像以前一样。

答案 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'));
})

现在你很好。运行并测试。