27609
routerのなかでやっていることが大きくなると起こっている気がするのですが、  
Expressのrouterへのリクエストが2回実行されるのはなぜでしょうか？

下の例の場合、２回目のリクエスト時のreq.params.idがundefinedになってしまいエラーが起こります。  
ログの用に一度のアクセスに対してrouterへ2回アクセスが行われてしまいます。

routes/detail.js

```

    router.get('/:id', function(req, res, next) {
      console.log("1");
      request.get({
        uri: API_URI,
        json: true
      }, function (error, response, body) {
        console.log("2");
        res.render('detail/index', {
          data: results[0],
        });
      }); 
    });
    
```

Log

```

    GET /apis/sellings/show?id=ABRH3B3N 304 2134.183 ms - -
    1
    GET /apis/sellings/show?id=ABRH3B3N 200 17.316 ms - 3123
    2
    GET /detail/ABRH3B3N 304 1273.452 ms - -
    GET /images/detail/icon_secure_trade.png 304 7.734 ms - -
    GET /javascripts/drawer.min.js 304 8.462 ms - -
    GET /stylesheets/common.css 200 11.189 ms - 77441
    GET /javascripts/modal.min.js 304 5.083 ms - -
    GET /javascripts/detail.js 304 6.725 ms - -
    GET /stylesheets/detail.css 200 20.716 ms - 19374
    GET /javascripts/common.js 304 0.459 ms - -
    GET /images/detail/icon_detail_mail.png 304 0.718 ms - -
    1
    GET /images/detail/icon_detail_facebook.png 304 7.804 ms - -
    GET /images/detail/icon_detail_twitter.png 304 6.480 ms - -
    GET /images/icon_people.png 304 6.643 ms - -
    GET /images/footer/twitter.png 304 3.776 ms - -
    GET /images/room_image_list.png 304 2.427 ms - -
    GET /images/footer/facebook.png 304 2.301 ms - -
    GET /apis/sellings/show?id=undefined 200 14.341 ms - 64
    2
    
```
CC BY-SA 3.0
2016-07-13T07:31:24.913
27596
2016-07-14T03:51:45.400
14401
question
node.js
Express - 2回アクセスが行われるのはなぜですか？
304(Not Modified)というレスポンスコードへの対処なので、問題ないと思います。

HTMLヘッダの最適化の一つに、ブラウザ側でキャッシュしているデータの更新時間をIf-Modified-
Sinceで送って、同じデータを何度も取得しないようにする手法があります。

この際、サーバー側に新しいデータがある場合には、そのデータが送り返されます。ステータスコードは２００です。  
サーバー側に新しいデータが無い（データは、ブラウザ側のキャッシュと同一）場合には、304(Not
Modified)というレスポンスコードだけが返されます（データは送られて来ません）。  
新しい・古いは、サーバ側のデータの最終更新時間と、if-modify-sinceで送られて来た時間との比較で判断します。

ブラウザは304のレスポンスを受けると、データをキャッシュ（インターネット一時ファイル）から取り出して表示します。

この仕組みを使うと、同じ内容のデータを何度も受信しないので、通信量の低減や表示速度の向上が期待できます。

ログの最初の２件を見ると

> GET /apis/sellings/show?id=ABRH3B3N 304 2134.183 ms - -

Getに対して、レスポンスコード３０４が返され、データは何も返されていない(最後の - )。

> GET /apis/sellings/show?id=ABRH3B3N 200 17.316 ms - 3123

２回目はレスポンスコード２００で、キャッシュから3123バイトを得ています。

１回目(2134ms)に比べて２回目(17ms)の応答時間が短いのは、ネットワークを経由しないのが主な原因だと思います。
CC BY-SA 3.0
2016-07-14T03:51:45.400
27609
2016-07-14T03:51:45.400
217
27596
answer