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


Answers:


152

您还可以通过指定其他(第一个)参数来设置将静态文件投放到网络的路径,use()如下所示:

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

这样,您将在网络上获得两个反映本地目录的不同目录,而不是在两个本地目录之间进行故障转移的URL路径。

换句话说,URL模式:

http://your.server.com/public/*

public在以下情况下,从本地目录提供文件服务:

http://your.server.com/public2/*

提供本地目录中的文件public2

顺便说一句,如果您不希望static从服务器的根目录而是从更合格的路径提供文件,这也很有用。

高温超导


1
完美的@facetcounter!只是将脚本指向了我的目录!脚本(src =“ / public2 / alertTest.js”)
Cody

如果使用React并尝试服务两个单独的应用程序,则需要在各自的React 应用程序的package.json中添加"homepage": "/public""homepage": "/public2"。有关使用两个React应用程序的更多信息,请在这里查看我的答案stackoverflow.com/a/48569896/4746648
Danny Harding

这特别有用,特别是当您需要一个shared文件夹以便可以使用"./"并快速"./shared"共享js文件时:3谢谢
Jaacko Torus

55

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

目录结构

  • /static
  • /alternate_static

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

static和alternate_static都将像在同一目录中一样被提供。但是,请注意文件名修饰符。


6
如果我理解正确,则不会发生文件名冲突,因为node使用它找到的文件的第一个版本。如果它看到main.jsstatic/它不会继续寻找中alternate_static/
RobW

2
如果您希望将文件alternate_static送达,那仍然很麻烦。
Randolpho

41

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


0
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.