web-dev-qa-db-ja.com

ʻexpress.static() `はルートからファイルをルーティングし続けます

Expressプロジェクトで作業しているときに、express.Routerオブジェクトを使用してアプリケーションルートを処理しようとしています。メインのアプリファイルに、すべての静的ファイル(css、javascript、html)の静的ルートを追加しました。

app.js

var express = require('express');
var io = require('socket.io')(app);
var bodyParser = require('body-parser');
var router = require('./include/router');

var app = express();
app.use('/', router);
app.use(express.static(__dirname + '/public'));
app.use(bodyParser.json());

io.on('connection', function(socket) {

});

app.listen(3000);

router.js

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

var router = express.Router();

router.get('/', function(req, res) {
  res.sendFile('/html/index.html');
});

module.exports = router;

localhost:3000にアクセスしようとすると、Error: ENOENT, stat 'C:\html\index.html'を示す404が表示されます

さらに、静的ルートに直接アクセスしようとすると(http://localhost:300/html/index.htmlと思います)、それでもCannot GET /html/index.htmlが得られます。

これは私のパブリックフォルダの木です

 public 
├───css
├───hmtl
 | └───index.html
├───img
└───js

私はこれを間違ってルーティングしていますか?どうすれば修正できますか?

11
an earwig

ルーターの順序を逆にする必要があります

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

つまり、ルーターが最初に呼び出され、ミドルウェアが要求を処理しない場合、expressは静的ファイルを呼び出すため、静的ミドルウェアを最初に配置すると、expressが最初に静的ファイルを処理します。

静的ミドルウェアを最初に配置することもお勧めします。

あなたの問題のためにあなたはこれを試すべきです:

app.use(express.static(__dirname + '/public/html'));
app.use(express.static(__dirname + '/public'));
app.use('/', router);

Expressは最初にpublic/htmlフォルダーで静的ファイルを試し、次に残り(public/htmlを含む)で試します。私はhtmlファイルをpublicフォルダーのルートまたは別のフォルダー(例:public-html、static-html)に置くことを好みます。 )

13