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);
};
};