ExpressJs - где express.static(__ dirname) указывает на?

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) 
        );
    });
  • Что делает метод app.use?
  • Что делает метод express.static? и где имя __dirname указывает на?.

Ответ 1

Что делает метод app.use?

Express имеет Middleware, который можно настроить с помощью app.configure, где мы можем вызвать использование app.use(). Middleware используется маршрутами, позволяет взять i app.use(express.bodyParser()), который добавил этот слой в стек Middleware. Это гарантирует, что для всех входящих запросов сервер анализирует тело, которое принимает Middleware. Это происходит потому, что мы добавили слой в наш Middleware.

http://www.senchalabs.org/connect/proto.html#app.use

Что такое метод express.static? и где указывает __dirname??

Код создает сервер Express, добавляет статический Middleware и, наконец, начинает прослушивать порт 3000 или предоставленный порт.

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

Приведенный выше код эквивалентен ниже, который вы понимаете.

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

Статическое промежуточное ПО обрабатывает содержимое содержимого из каталога. В этом случае будет загружен каталог "root", и будет доступен любой контент (HTML, CSS, JavaScript). Это означает, что корневой каталог выглядит следующим образом:

index.html
js - folder
css - folder

Для получения дополнительной информации по той же теме ниже приведены ссылки на stackoverflow.

Ответ 2

В Node __dirname является глобальным объектом, который содержит имя каталога, из которого выполняется исполняемый script. Например, если вы выполняете node script.js из /home/user/env, то __dirname будет содержать `/home/user/env.

Метод app.use() - это функция, унаследованная от структуры Connect, на которой написана структура Express. Этот метод добавляет функцию промежуточного программного обеспечения в стек приложения, который запускается каждый раз, когда Express получает запрос.

Код, который вы указали, монтирует статический сервер к пути /, который читает из каталога, из которого script выполняется:

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

Если вы должны были изменить путь к /path, тогда статический файловый сервер будет вместо этого использовать статические файлы с этого пути. Если вы не укажете путь, то по умолчанию используется /.

Что касается того, что делает express.static(), он принимает путь и возвращает функцию промежуточного программного обеспечения, которая прослушивает запросы. Вот как работает промежуточное ПО:

  • Проверьте, есть ли метод запроса GET или HEAD. Если ни один, не игнорируйте запрос.
  • Проанализируйте путь и приостановите запрос.
  • Проверьте, есть ли перенаправление по умолчанию. Если да, переадресуйте с помощью HTTP 303.
  • Определите обработчики, если встречается каталог или ошибка.
  • Передайте все в модуль send для идентификации 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);
  };
};