JavaScript. Подробное руководство, 6-е издание, стр. 167

<b>  }</b>

<b>  // Иначе обслужить файл из локального каталога,</b>

<b>  else {</b>

<b>    // Получить имя локального файла и определить тип его содержимого по расширению,</b>

<b>    var filename = url.pathname.substring(1); // удалить начальный /</b>

<b>    var type;</b>

<b>    switch(filename.substring(filename.lastlndexOf(&quot;.&quot;)+1)) { // расшир.</b>

<b>    case &quot;html&quot;:</b>

<b>    case &quot;htm&quot;:      type = &quot;text/html; charset=UTF-8&quot;; break;</b>

<b>    case &quot;js&quot;:       type = &quot;application/JavaScript;charset=UTF-8&quot;; break;</b>

<b>    case &quot;css&quot;:      type = &quot;text/css; charset=UTF-8&quot;; break;</b>

<b>    case &quot;txt&quot;:      type = &quot;text/plain; charset=UTF-8&quot;; break;</b>

<b>    case &quot;manifest&quot;: type = &quot;text/cache-manifest; charset=UTF-8&quot;; break;</b>

<b>    default: type = &quot;application/octet-stream&quot;; break;</b>

<b>    }</b>

<b>    // Прочитать файл в асинхронном режиме и передать его содержимое единым блоком</b>

<b>    // в функцию обратного вызова. Для очень больших файлов лучше было бы</b>

<b>    // использовать API потоков ввода/вывода с функцией</b>

<b>    fs.createReadStream().</b>
<b>fs.readFile(filename, function(err, content) {</b>

<b>      if (err) { // Если no каким-то причинам невозможно прочитать файл</b>

<b>        response.writeHead(404, { // Отправить 404 Not Found</b>

<b>        &quot;Content-Type&quot;: &quot;text/plain; charset=UTF-8&quot;});</b>

<b>        response.write(err.message); // Тело сообщения об ошибке</b>

<b>        response.end(); // Завершить отправку</b>

<b>      }</b>

<b>      else { // Иначе, если файл успешно прочитан.</b>

<b>        response.writeHead(200, // Установить код состояния и тип MIME </b>

<b>          {&quot;Content-Type&quot;: type});</b>

<b>        response.write(content); // Отправить содержимое файла</b>

<b>        response.end(); // И завершить отправку</b>

<b>      }</b>

<b>    }):</b>

<b>  }</b>

<b>});</b>

12.2.2. Пример использования Node: модуль утилит клиента HTTP

В примере 12.3 определяется несколько вспомогательных клиентских функций, использующих модуль «http», позволяющих выполнять GET- и POST-запросы протокола HTTP. Пример оформлен как модуль «httputils», который можно использовать в собственных программах, например:

<b>var httputils = require(&quot;./httputils&quot;); // Отметьте отсутствие расш. &quot;.js&quot; </b>

<b>httputils.get(иrl. function(status. headers, body) { console.log(body); });</b>

При выполнении программного кода модуля функция

<b>require()</b>
не использует обычную функцию
<b>eval().</b>
Модули выполняются в специальном окружении, чтобы они не могли определять глобальные переменные или как-то иначе изменять глобальное пространство имен. Это специализированное окружение для выполнения модулей всегда включает глобальный объект с именем exports. Модули экспортируют свои API, определяя свойства этого объекта. [27]

Пример 12.3. Модуль «httputils» для интерпретатора Node

<b>//</b>

<b>// Модуль &quot;httputils&quot; для интерпретатора Node.</b>

<b>//</b>

<b>// Выполняет асинхронный HTTP GET-запрос для указанного URL и передает </b>

<b>// код состояния HTTP, заголовки и тело ответа указанной функции обратного </b>

<b>// вызова. Обратите внимание, как этот метод экспортируется через объект exports. </b>

<b>exports.get = function(url, callback) {</b>

<b>  // Разобрать URL и получить необходимые фрагменты</b>

<b>  url = require('url‘).parse(url);</b>

<b>  var hostname = url.hostname, port = url.port || 80;</b>

<b>  var path = url.pathname, query = url.query;</b>

<b>  if (query) path += &quot;?” + query;</b>

<b>  // Выполняем простой GET-запрос</b>

<b>  var client = require(&quot;http&quot;).createClient(port, hostname);</b>

<b>  var request = client.request(&quot;GET”, path, {</b>

<b>    &quot;Host&quot;: hostname // Заголовки запроса</b>

<b>  });</b>

<b>  request.end();</b>

<b>  // Функция обработки ответа после начала его получения </b>

<b>  request.on(&quot;response&quot;, function(response) {</b>