14
var express = require('express');
var app = express();
port = process.argv[2] || 8000;

app.configure(function () {
    app.use(
        "/", 
        express.static(__dirname) 
    );
});
app.listen(port);

以下の行を削除したところ、localhost の読み込み中にエラーが発生しました

app.configure(function () {
        app.use(
            "/", 
            express.static(__dirname) 
        );
    });
  1. app.use メソッドは何をしますか?
  2. express.static メソッドは何をしますか? __dirname はどこを指していますか?
4

2 に答える 2

24

Node では、__dirnameは実行中のスクリプトが存在するディレクトリの名前を含むグローバル オブジェクトです。たとえば、node script.jsから実行している場合は/home/user/env__dirnameが含まれます`/home/user/env

このメソッドは、 Express が記述されているフレームワークであるConnectapp.use()フレームワークから継承された関数です。このメソッドは、Express がリクエストを受信するたびに実行されるミドルウェア機能をアプリケーション スタックにアタッチします。

/あなたが示したコードは、スクリプトが実行されているディレクトリから読み取るパスに静的サーバーをマウントします。

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

パスを に変更した場合/path、静的ファイル サーバーは代わりにそのパスから静的ファイルを提供します。パスを指定しない場合/、デフォルトで then が使用されます。

それ自体が何をするかについてexpress.static()は、パスを受け入れ、リクエストをリッスンするミドルウェア関数を返します。ミドルウェアの仕組みは次のとおりです。

  1. リクエスト メソッドがGETまたはであるかどうかを確認しHEADます。どちらでもない場合は、リクエストを無視します。
  2. パスを解析し、リクエストを一時停止します。
  3. デフォルトのリダイレクトがあるかどうかを確認します。その場合は、HTTP 303.
  4. ディレクトリまたはエラーが発生した場合のハンドラを定義します。
  5. MIME 識別とファイル サービスのためにすべてを送信モジュールに渡します。

static()参考までに、Connectのミドルウェア ソースを次に示します。

exports = module.exports = function(root, options) {
  options = options || {};

  // root required
  if (!root) throw new Error('static() root path required');

  // default redirect
  var redirect = false !== options.redirect;

  return function staticMiddleware(req, res, next) {
    if ('GET' != req.method && 'HEAD' != req.method) return next();
    var path = parse(req).pathname;
    var pause = utils.pause(req);

    function resume() {
      next();
      pause.resume();
    }

    function directory() {
      if (!redirect) return resume();
      var pathname = url.parse(req.originalUrl).pathname;
      res.statusCode = 303;
      res.setHeader('Location', pathname + '/');
      res.end('Redirecting to ' + utils.escape(pathname) + '/');
    }

    function error(err) {
      if (404 == err.status) return resume();
      next(err);
    }

    send(req, path)
      .maxage(options.maxAge || 0)
      .root(root)
      .index(options.index || 'index.html')
      .hidden(options.hidden)
      .on('error', error)
      .on('directory', directory)
      .pipe(res);
  };
};
于 2013-09-20T00:26:08.763 に答える