> if (body && body.pipe)
> body.pipe(response);
> else
> response.end(body);
> }
> if (request.method in methods)
> methods[request.method](urlToPath(request.url),
> respond, request);
> else
> respond(405, "Method " + request.method
> " not allowed.");
>}).listen(8000);
Этот код запустит сервер, возвращающий ошибки 405 – этот код используется для обозначения того, что запрошенный метод сервером не поддерживается.
Функция >respond
передаётся функциям, обрабатывающим разные методы, и работает как обратный вызов для окончания запроса. Она принимает код статуса HTTP, тело, и, возможно, тип содержимого. Если переданное тело – поток с возможностью чтения, у него будет метод >pipe
, который используется для передачи читаемого потока в записываемый. Если нет – предполагается, что это либо >null
(тело пустое), или строка, и тогда она передаётся напрямую в метод ответа >end
.
Чтобы получить путь из URL в запросе, функция >urlToPath
, используя встроенный модуль Node >“url”
, разбирает URL. Она принимает имя пути, нечто вроде >/file.txt
, декодирует, чтобы убрать экранирующие коды >%20
, и вставляет в начале точку, чтобы получить путь относительно текущего каталога.
>function urlToPath(url) {
> var path = require("url").parse(url).pathname;
> return "." + decodeURIComponent(path);
>}
Вам кажется, что функция >urlToPath
небезопасна? Вы правы. Вернёмся к этому вопросу в упражнениях.
Мы устроим метод >GET
так, чтобы он возвращал список файлов при чтении директории, и содержимое файла при чтении файла.
Вопрос на засыпку – какой тип заголовка >Content-Type
мы должны возвращать, читая файл. Поскольку в файле может быть всё, что угодно, сервер не может просто вернуть один и тот же тип для всех. Но NPM с этим может помочь. Модуль >mime
(индикаторы типа содержимого файла вроде >text/plain
также называются MIME types) знает правильный тип для огромного количества расширений файлов.
Запустив следующую команду >npm
в директории, где живёт скрипт сервера, вы сможете использовать >require("mime")
для запросов к библиотеке типов.
>$ npm install mime
>npm http GET https://registry.npmjs.org/mime
>npm http 304 https://registry.npmjs.org/mime
>mime@1.2.11 node_modules/mime
Когда запрошенного файла не существует, правильным кодом ошибки для этого случая будет 404. Мы будем использовать >fs.stat
для возврата информации по файлу, чтобы выяснить, есть ли такой файл, и не директория ли это.
>methods.GET = function(path, respond) {
> fs.stat(path, function(error, stats) {
> if (error && error.code == "ENOENT")