node.js Expressフレームワークで2つの異なる静的ディレクトリを設定する


101

出来ますか?静的ファイルを提供するために2つの異なるディレクトリを設定したいと思います。/ publicおよび/ mntとしましょう


2
このページはそれが可能であると言っているようですが、それ以上の詳細には入りません。
ニラ

回答:


152

追加の(最初の)パラメーターを次のuse()ように指定して、静的ファイルがWebに提供されるパスを設定することもできます。

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

これにより、ローカルディレクトリをミラーリングする2つの異なるディレクトリがWeb上に取得されます。2つのローカルディレクトリ間でフェイルオーバーする1つのURLパスではありません。

つまり、URLパターン:

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

ローカルディレクトリからファイルを提供しますpublic

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

ローカルディレクトリからファイルを提供しますpublic2

ところで、これは、サーバーのルートからではなく、より限定されたパスからファイルを静的に提供したくない場合にも役立ちます。

HTH


1
パーフェクト@facetcounter!スクリプトを私のディレクトリにポイントしました!script(src = "/ public2 / alertTest.js")
Cody

リアクト使用して2つの別々のアプリケーションにサービスを提供しようとする場合は、追加する必要がある"homepage": "/public""homepage": "/public2"、それぞれのアプリのpackage.jsonを反応させます。2つの反応アプリの使用の詳細については、こちらの私の回答をご覧ください。stackoverflow.com
Danny Harding

これは、お好きな時に特別に非常に便利であるsharedフォルダを使用できるように"./""./shared"、あなたがすることができます簡単に共有のjsファイルをブーム:3ありがとうございました
Jaackoトーラス

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.jsにはstatic/それに見ていきませんalternate_static/
RobW 2013年

2
あなたがファイルが提供alternate_staticされることを期待していたならば、それはまだ雑談です。
Randolpho

41

1回のミドルウェアインジェクションでは不可能ですが、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);

パスは1回だけチェックされ、ファイルが見つからない場合、リクエストは次のミドルウェアに渡されます。

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.