node.js Express 프레임 워크에서 두 개의 서로 다른 정적 디렉토리 설정


101

가능할까요? 정적 파일을 제공하기 위해 두 개의 다른 디렉토리를 설정하고 싶습니다. / public 및 / mnt라고 가정하겠습니다.


2
이 페이지 는 가능하다고 말한 것 같지만 그보다 더 자세하게 다루지는 않습니다.
부추

답변:


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.

BTW 이것은 또한 정적이 서버의 루트에서 파일을 제공하지 않고 더 정규화 된 경로에서 제공하는 것을 원하지 않는 경우에도 유용합니다.

HTH


1
완벽한 @facetcounter! 내 디렉토리에 스크립트를 지정했습니다! script (src = "/ public2 / alertTest.js")
Cody

반작용 사용하여 두 개의 응용 프로그램을 제공하기 위해 노력하는 경우, 당신은 추가해야 "homepage": "/public"하고 "homepage": "/public2"각 앱의 package.json 반응에. 두 반응 앱 사용에 대한 자세한 내용은 여기 내 대답을 참조하십시오. stackoverflow.com/a/48569896/4746648
Danny Harding

당신이 할 때이 특별히 매우 유용합니다 shared당신이 사용할 수 있도록 폴더를 "./"하고 "./shared"3 감사합니다 : 당신 쉽게 공유 JS 파일 붐
Jaacko 원환

55

디렉토리를 하나의 보이는 디렉토리로 "병합"할 수도 있습니다.

디렉토리 구조

  • /static
  • /alternate_static

암호

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

static 및 alternate_static은 모두 동일한 디렉토리에있는 것처럼 제공됩니다. 그러나 파일 이름 클로버를 조심하십시오.


6
노드가 찾은 파일의 첫 번째 버전을 사용하기 때문에 올바르게 파일 이름 충돌이 발생하지 않는다는 것을 이해하면. main.js에서 볼 경우 static/계속 검색하지 않습니다 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'));
});

설명

에서 봐 연결 / lib 디렉토리 / 미들웨어 / 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에 대해 실제적이지 않지만 여러 정적 미들웨어 사용은 이전과 같이 여전히 가능합니다.


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.