express.jsを使用した静的ファイル


213

サブディレクトリを静的ファイルとして提供index.htmlしたい/media。インデックスファイルは/index.html/URLの両方で提供する必要があります。

私が持っています

web_server.use("/media", express.static(__dirname + '/media'));
web_server.use("/", express.static(__dirname));

しかし、2行目は明らかに、全体を提供し__dirname、その中のすべてのファイル(index.htmland だけmediaではありません)を提供します。

私も試しました

web_server.use("/", express.static(__dirname + '/index.html'));

ただし、ベースURLにアクセスすると、(ダブルコンポーネント)/へのリクエストが発生しますが、もちろん失敗します。web_server/index.html/index.htmlindex.html

何か案は?


ちなみに、Expressのこのトピック(static()+パラメータ)に関するドキュメントはまったく見つかりませんでした。ドキュメントリンクも歓迎します。


2
Express 4.x以降でexpress.static()は、serve-staticパッケージミドルウェアによって処理されます。そのドキュメントはnpmjs.com/package/serve-staticまたはgithub.com/expressjs/serve-staticにあります。
Anm、2015年

誰かが「静的ファイルとしてのサーバー」の意味を説明できますか?
Abhi 2016

@iLiveInAPineappleUnderTheSea Expressを使用する場合など、動的Webアプリケーションでは、ページコンテンツはアプリケーションによって作成(または生成)されます。一方、静的ファイルは、(ほとんど)変更されずに静的ディレクトリ階層から提供されます。たとえば、ページが変更されても、画像ファイル、CSSファイル、JavaScriptファイルは変更されません。
Philip Callender

回答:


100

express.static()最初のパラメータは、ファイル名ではなくディレクトリのパスであると想定しています。あなたを含む別のサブディレクトリを作成し、index.htmlそれを使用することをお勧めします。

Expressのドキュメント、またはより詳細なserve-staticドキュメントでの静的ファイルの提供(提供のデフォルトの動作をindex.html含む):

デフォルトでは、このモジュールはディレクトリへのリクエストに応じて「index.html」ファイルを送信します。この設定を無効にするか、新しいインデックスを指定するには、文字列または配列を優先順に渡します。


6
また、参考までに、デフォルトで別のディレクトリにあるindex.htmlを提供します
TheSteve0

パラメータexpress.staticが1つしかない場合- その1つのパラメータがパスであると想定します...
Seti

188

この設定がある場合

/app
   /public/index.html
   /media

その後、これはあなたが望むものを取得するはずです

var express = require('express');
//var server = express.createServer();
// express.createServer()  is deprecated. 
var server = express(); // better instead
server.configure(function(){
  server.use('/media', express.static(__dirname + '/media'));
  server.use(express.static(__dirname + '/public'));
});

server.listen(3000);

トリックは、このラインを最後のフォールバックとして残すことです

  server.use(express.static(__dirname + '/public'));

ドキュメントに関しては、Expressは接続ミドルウェアを使用しているため、接続ソースコードを直接見るだけの方が簡単であることがわかりました。

たとえば、この行は、index.htmlがサポートされていることを示してい ますhttps://github.com/senchalabs/connect/blob/2.3.3/lib/middleware/static.js#L140


15
Application.configure()3.xではレガシーとして文書化され、4.xでは削除されました。更新された例については、ChrisCantrellの回答を参照してください。
Anm

ありがとう、これは大いに役立った
mdegges

なに__dirname?その価値は?
Abhi 2016

1
最新のエクスプレスのために時代遅れ。
John Heeter 2017

133

Expressの最新バージョンでは、「createServer」は非推奨です。この例は私にとってはうまくいきます:

var express = require('express');
var app = express();
var path = require('path');

//app.use(express.static(__dirname)); // Current directory is root
app.use(express.static(path.join(__dirname, 'public'))); //  "public" off of current is root

app.listen(80);
console.log('Listening on port 80');

__dirnameはキーワードですか?
Mohammad Faizan khan 2014

6
これは、nodejsモジュールのグローバルです。nodejs.org/docs/latest/api/globals.html#globals_dirname
ChrisCantrell

7
__dirnameは実際にはグローバルではなく、各モジュールに対してローカルです。
Mohammad Faizan khan 2014

2
これは、Pythonで__file__使用するものとos.path.dirname(os.path.realpath(__file__))
同じ

@ChrisCantrellファイルを持っている場合、静的フォルダに追加するにはどうすればよいpublic/teams/logo.pngですか?
michal

37

res.sendFileexpress.static両方ともこれで機能します

var express = require('express');
var app = express();
var path = require('path');
var public = path.join(__dirname, 'public');

// viewed at http://localhost:8080
app.get('/', function(req, res) {
    res.sendFile(path.join(public, 'index.html'));
});

app.use('/', express.static(public));

app.listen(8080);

publicクライアントサイドコードがあるフォルダはどこですか

提案により@ATOzTOAによって清澄 @Vozziepath.join引数として参加する経路をとり、+パスに単一の引数を渡します。


2
path.join結合するパスを引数として取り、パス+は単一の引数をパスに渡します。
ATOzTOA

@ATOzTOAについて詳しく説明してください
Mohammed Zameer

何@ATOzTOAが言っていることは、あなたが変更する必要があるpath.join(public + 'index.html')path.join(public, 'index.html')それにいる間、変化と__dirname + "/public/"path.join(__dirname, 'public')
Vozzie

これは、静的サイトとAPIをすべて1つに
まとめるのに役立ちました

4
const path = require('path');

const express = require('express');

const app = new express();
app.use(express.static('/media'));

app.get('/', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'media/page/', 'index.html'));
});

app.listen(4000, () => {
    console.log('App listening on port 4000')
})

2

npm install serve-index

var express    = require('express')
var serveIndex = require('serve-index')
var path = require('path')
var serveStatic = require('serve-static')
var app = express()
var port = process.env.PORT || 3000;
/**for files */
app.use(serveStatic(path.join(__dirname, 'public')));
/**for directory */
app.use('/', express.static('public'), serveIndex('public', {'icons': true}))

// Listen
app.listen(port,  function () {
  console.log('listening on port:',+ port );
})

2

app.js内で以下を使用します

app.use(express.static('folderName'));

(folderNameはファイルのあるフォルダーです)-これらのアセットはサーバーパス(つまり、http:// localhost:3000 / abc.png (abc.pngはfolderNameフォルダー内にあるため)を介して直接アクセスされます)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.