17331


node.jsとexpressを用いたサーバ構築についてわからないことがあったので質問します。

質問内容は

[code]

    app.use(express.static(__dirname));
    
[/code]

と

[code]

    app.get('/', function(req, res){});
    
[/code]

の記述順番によって意図しない結果が返ってくるというものです。

* * *

質問：  
パターン１の位置にexpress.staticを記述し、[http://localhost:3000にアクセスすると](http://localhost:3000%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B%E3%81%A8)、index.htmlの内容が表示されるのはなぜでしょうか？  
また、htmlのファイル名がindex.htmlの時にだけこの現象が起こるのですがなぜでしょうか？

想定している動き：  
app.getではtestpage.html（存在しないhtml）を返すと記述しているので、localhost:3000にアクセスするとError:
ENOENTとなるはずでは？

備考：  
普段はパターン2の位置にexperss.staticを記述していました。2の位置にexpress.staticを記述しlocalhost:3000にアクセスするとError:
ENOENTとなります(想定通り)

認識している点：

[code]

    app.use(express.static(__dirname + '/public'));
    
[/code]

指定したディレクトリ以下の静的ファイルを公開する

[code]

    app.get('/', function(req, res){});
    
[/code]

引数で指定されたGETリクエストに対して処理を行う。今回の質問の場合指定したhtmlファイルを返す。

* * *

以下サンプルを示します。

ディレクトリ構成  
app  
├package.json  
├app.js  
├node_modules  
│ └express  
└public  
└index.html

app.js

[code]

    var express = require('express');
    var app = express();
    var http = require('http').Server(app);
    
    //パターン１
    app.use(express.static(__dirname + '/public'));
    
    app.get('/', function(req, res){
      res.sendFile(__dirname + '/public/testpage.html');
    });
    
    //パターン2
    //app.use(express.static(__dirname + '/public'));
    
    http.listen(3000, function(){
     console.log('Web Server listening on *:3000');
    });
    
[/code]

index.html

[code]

    <!doctype html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
        <title>testpage</title>
    </head>
    <body>
      <h1>Test Page</h1>
    </body>
    </html>
    
[/code]

基本的なことで恐縮ですが教えていただけるとありがたいです。


CC BY-SA 3.0
2015-10-07T00:25:59.633
17330
2015-10-07T01:14:34.717
10728
question
javascript node.js
node.jsとexpressのexpress.staticについて


`index.html`は`/`に対しての予約語・エイリアスとして定着している言わば方言で、ディレクトリのエントリポイント（最初にアクセスするべきファイル）を指します。`Apache`や`nginx`,
`node-static`など、他のサーバーでも頻繁に利用されている設定です。

`express.static`の実態は[`serve-static`モジュール](https://github.com/expressjs/serve-
static#serve-files-with-vanilla-nodejs-http-
server)です。第二引数で`/`の振る舞いを変更することが出来ます。

`express()`の`.use`,`.get`,`.post`などは、書いた順番に`url`が一致するかチェックを行いますが、コールバック関数の第三引数(e.g.`function(req,res,next){next()}`)を実行すると、一致している場合でも、次のコールバック関数に処理をそのまま渡すことが出来ます。

[code]

    $ node app.js
    # Web Server listening on *:3000
    
    $ open http://localhost:3000/
    # 1
    # 2
    # 3
    # 4
    
[/code]

[code]

    var express= require('express');
    var app= express();
    var http= require('http').Server(app);
    
    app.use(function(req,res,next){
      console.log('1');
      next();
    });
    app.use('/',function(req,res,next){
      console.log('2');
      next();
    });
    app.get('/',function(req,res,next){
      console.log('3');
      next();
    });
    
    app.use(function(req,res,next){
      console.log('4');
      res.status(404).end('404 Notfound');
    });
    
    http.listen(3000,function(){
      console.log('Web Server listening on *:3000');
    });
    
[/code]


CC BY-SA 3.0
2015-10-07T01:14:34.717
17331
2015-10-07T01:14:34.717
9834
17330
answer