Использование Node.js в качестве простого веб-сервера

Я хочу запустить очень простой HTTP-сервер. Каждый запрос GET к example.com должен обслуживаться index.html, но как обычная HTML-страница (то есть такой же опыт, как при чтении обычных веб-страниц).

Используя приведенный ниже код, я могу прочитать содержимое index.html. Как мне использовать index.html как обычную веб-страницу?

var http = require('http');
var fs = require('fs');
var index = fs.readFileSync('index.html');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end(index);
}).listen(9615);

Одно из приведенных ниже предложений является сложным и требует, чтобы я написал строку get для каждого файла ресурса (CSS, JavaScript, изображения), который я хочу использовать.

Как я могу обслужить одну HTML-страницу с некоторыми изображениями, CSS и JavaScript?


person idophir    schedule 21.05.2011    source источник
comment
Взгляните на модуль npm connect. Он обеспечивает такую ​​базовую функциональность и является основой многих настроек и других пакетов.   -  person Mörre    schedule 22.05.2011
comment
Вы должны поставить свое решение в качестве ответа и отметить его как правильное.   -  person graham.reeds    schedule 02.06.2011
comment
Мне удалось найти идеальное решение Эрика Б. Соуэлла под названием Обслуживание статических файлов из узла js. Прочтите все это. Настоятельно рекомендуется.   -  person idophir    schedule 06.06.2011
comment
Взгляните на написанный мной модуль под названием Cachemere. Он также автоматически кэширует все ваши ресурсы. github.com/topcloud/cachemere   -  person Jon    schedule 25.11.2013
comment
local-web-server - хороший пример, на который стоит обратить внимание.   -  person Lloyd    schedule 10.05.2014
comment
Эм, разве ваш код еще не обслуживает файл как обычную веб-страницу? Измените его на порт 80, если вы хотите использовать порт по умолчанию. В противном случае вам больше ничего не нужно.   -  person B T    schedule 14.10.2014
comment
У меня также есть требование, поэтому я написал его, это веб-сервер, использующий один файл javascript: github.com/supnate/single. Никакой другой библиотеки для этого не требуется.   -  person supNate    schedule 10.11.2014
comment
просто измените тип контента на text/html   -  person Hank W    schedule 23.05.2021


Ответы (33)


Самый простой сервер Node.js - это просто:

$ npm install http-server -g

Теперь вы можете запустить сервер с помощью следующих команд:

$ cd MyApp

$ http-server

Если вы используете NPM 5.2.0 или новее, вы можете использовать http-server, не устанавливая его с npx. Это не рекомендуется для использования в производственной среде, но это отличный способ быстро запустить сервер на localhost.

$ npx http-server

Или вы можете попробовать это, чтобы открыть ваш веб-браузер и разрешить запросы CORS:

$ http-server -o --cors

Дополнительные параметры см. В документации для http-server на GitHub или выполните:

$ http-server --help

Множество других приятных функций и невероятно простое развертывание в NodeJitsu.

Функциональные вилки

Конечно, вы можете легко пополнить возможности собственным форком. Возможно, вы обнаружите, что это уже сделано в одной из существующих более 800 форков этого проекта:

Легкий сервер: альтернатива автообновлению

Хорошая альтернатива http-server - light-server. Он поддерживает просмотр файлов и автоматическое обновление, а также многие другие функции.

$ npm install -g light-server 
$ light-server

Добавить в контекстное меню каталога в проводнике Windows

 reg.exe add HKCR\Directory\shell\LightServer\command /ve /t REG_EXPAND_SZ /f /d "\"C:\nodejs\light-server.cmd\" \"-o\" \"-s\" \"%V\""

Простой сервер JSON REST

Если вам нужно создать простой REST-сервер для прототипа проекта, тогда json-server может быть тем, чем вы ищем.

Автообновление редакторов

Большинство редакторов веб-страниц и инструментов IDE теперь включают веб-сервер, который будет отслеживать ваши исходные файлы и автоматически обновлять вашу веб-страницу при их изменении.

Я использую Live Server с Visual Studio Code.

Текстовый редактор с открытым исходным кодом Brackets также включает статический веб-сервер NodeJS. Просто откройте любой HTML-файл в скобках, нажмите Live Preview, и он запустит статический сервер и откроет ваш браузер на странице. Браузер будет автоматически обновляться всякий раз, когда вы редактируете и сохраняете HTML-файл. Это особенно полезно при тестировании адаптивных веб-сайтов. Откройте свою HTML-страницу в разных браузерах / размерах окон / устройствах. Сохраните свою HTML-страницу и сразу проверьте, работают ли ваши адаптивные элементы, поскольку они все обновляются автоматически.

Веб-разработчики / веб-сайты / SPA / PWA / мобильные устройства / ПК / браузеры (Ext)

Некоторые фреймворки SPA включают встроенную версию Webpack DevServer, которая может обнаруживать изменения исходного файла. и запускать инкрементную перестройку и исправление (так называемую горячую перезагрузку) вашего веб-приложения SPA или PWA. Вот несколько популярных фреймворков SPA, которые могут это сделать.

Разработчики VueJS

Для разработчиков VueJS фаворитом является Quasar Framework, который из коробки включает Webpack DevServer с переключателями для поддержки рендеринга на стороне сервера. (SSR) и правила прокси для устранения проблем с CORS. Он включает в себя большое количество оптимизированных компонентов, предназначенных для адаптации как для мобильных, так и для настольных компьютеров. Это позволяет вам создавать одно приложение для ВСЕХ платформ (SPA, SPA + SSR, PWA, PWA + SSR, приложения Cordova и Capacitor Mobile AppStore, приложения Electron Desktop Node + VueJS и даже расширения для браузера).

Другой популярный - NuxtJS, который также поддерживает генерацию статического кода HTML / CSS, а также режимы сборки SSR или без SSR с плагинами. для других наборов компонентов пользовательского интерфейса.

Разработчики React Framework

Разработчики ReactJS также могут настроить горячую перезагрузку.

Разработчики Cordova / Capacitor + Ionic Framework

Iconic - это только для мобильных гибридных компонентов, которые теперь поддерживают разработку на VueJS, React и Angular. Локальный сервер с функциями автоматического обновления встроен в инструмент ionic. Просто запустите ionic serve из папки вашего приложения. Еще лучше ... ionic serve --lab, чтобы просматривать автоматически обновляющиеся параллельные представления iOS и Android .

person Tony O'Hagan    schedule 17.04.2014
comment
npm install live-server -g, если вы хотите то же самое, но с автоматической перезагрузкой при обнаружении изменения файла - person ; 14.05.2015
comment
Одна маленькая ошибка -. http-сервер по умолчанию обслуживает сайт на 0.0.0.0. Следовательно, вы ДОЛЖНЫ указать IP-адрес, чтобы он правильно работал в качестве локального тестового сервера: http-server -a localhost - person JESii; 11.06.2015
comment
Да ... 0.0.0.0 заставит его привязаться ко ВСЕМ IP-адресам всех ваших сетевых IP-устройств (Wi-Fi, кабель, Bluetooth), что является плохой идеей для любой общедоступной сети, поскольку вы потенциально можете быть взломаны. Это не так уж плохо, если вы просто хотите продемонстрировать свое приложение в безопасной защищенной огнем сети, чтобы показать другим или подключить его к своему мобильному устройству в той же сети. - person Tony O'Hagan; 12.06.2015
comment
Действительно полезный маленький инструмент. На моем сервере работает множество приложений Node, поэтому я добавляю параметр -p, чтобы выбрать порт, отличный от 8080. Например: nohup http-server -p 60080 & (запускает его в фоновом режиме и позволяет отключиться от сеанса оболочки. .) Вы должны убедиться, что порт открыт для всего мира, например: iptables -I INPUT 1 -p tcp --dport 60090 -j ACCEPT (во многих системах Linux) - person Blisterpeanuts; 12.12.2017
comment
Как запустить его как службу, чтобы я мог использовать его, даже закрыв командную строку. Есть ли какой-нибудь инструмент, обеспечивающий такого рода, если не этот. - person Sandeep sandy; 09.08.2019
comment
Зависит от вашей платформы. Для производства я бы рекомендовал изучить PM2 pm2.keymetrics.io - person Tony O'Hagan; 11.08.2019
comment
Если вы хотите выполнить развертывание в облаке ... вы также можете изучить другие варианты, такие как netlify, firebase (без сервера). тонны больше. - person Tony O'Hagan; 11.08.2019

Примечание. Это ответ 2011 года. Однако он все еще действителен.

Вы можете использовать Connect и ServeStatic с Node.js для этого:

  1. Установите connect и serve-static с помощью NPM

     $ npm install connect serve-static
    
  2. Создайте файл server.js с таким содержимым:

     var connect = require('connect');
     var serveStatic = require('serve-static');
    
     connect()
         .use(serveStatic(__dirname))
         .listen(8080, () => console.log('Server running on 8080...'));
    
  3. Запускаем с Node.js

     $ node server.js
    

Теперь вы можете перейти к http://localhost:8080/yourfile.html

person Gian Marco    schedule 08.12.2011
comment
Идея заключалась в том, чтобы не использовать существующую библиотеку по образовательным причинам, но я думаю, что использование Express - лучший совет, чем его версия более низкого уровня, Connect. - person idophir; 08.12.2011
comment
Часть Express, обслуживающая статический файл, - это просто Connect, поэтому я не вижу причин использовать Express для обслуживания статических файлов. Но да, Express тоже справится со своей задачей. - person Gian Marco; 09.12.2011
comment
Отличный совет. Приведенные выше шаги очень хорошо сработали для моих целей. Спасибо Джиану, вот ссылка на Express, где показано, что он построен на Connect, expressjs.com Вот как для использования Express: expressjs.com/guide.html - person Jack Stone; 25.06.2012
comment
У меня не работает, результат Cannot GET /test.html. Должен ли я заменить __dirname именем каталога? - person Timo; 26.10.2013
comment
@Timo, находится ли test.html в каталоге, из которого вы начинаете node? Вам не нужно менять __dirname. - person nymo; 03.03.2014
comment
Возможно, этот ответ устарел, потому что все, что я могу получить, это TypeError: Object function createServer() {...} has no method 'static' Очевидно static теперь является промежуточным ПО для connect, но я не знаю, как его установить - person JLDiaz; 30.05.2014
comment
@JLDiaz static заменяется на serve-static в connect 3.0. npm install serve-static должен сделать свое дело. - person miqh; 31.05.2014
comment
В настоящее время текущая версия connect - 2.19.4, и код работает над этой версией. Когда connect v3 станет текущим, я обновлю ответ - person Gian Marco; 07.06.2014
comment
Теперь соединение изменилось на версию 3. Следовательно, нужно использовать serve-static, как описано в miqid. Я опубликовал еще один ответ с полным кодом для подключения v3. - person tomet; 20.06.2014
comment
Что с этими ответами? Просто скажи ему res.write(index). Неужели это так сложно? Вам не нужно подключаться или выражать ВООБЩЕ - person B T; 14.10.2014
comment
Может ли кто-нибудь сказать мне, почему я получаю сам html-код, а не сам html после рендеринга? Пробовал разные методы (приведенный выше, экспресс, пытался добавить тип содержимого для ответа, ничего не работает. - person MikeL; 19.12.2014
comment
В последней версии Express serve-static стал отдельным промежуточным программным обеспечением. Используйте это для обслуживания: require('http').createServer(require('serve-static')('.')).listen(3000). Сначала установите serve-static. - person Devs love ZenUML; 26.05.2015

Ознакомьтесь с этой сутью. Я воспроизвожу его здесь для справки, но суть регулярно обновляется.

Статический файловый веб-сервер Node.JS. Поместите его в свой путь для запуска серверов в любом каталоге, принимает необязательный аргумент порта.

var http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs"),
    port = process.argv[2] || 8888;

http.createServer(function(request, response) {

  var uri = url.parse(request.url).pathname
    , filename = path.join(process.cwd(), uri);

  fs.exists(filename, function(exists) {
    if(!exists) {
      response.writeHead(404, {"Content-Type": "text/plain"});
      response.write("404 Not Found\n");
      response.end();
      return;
    }

    if (fs.statSync(filename).isDirectory()) filename += '/index.html';

    fs.readFile(filename, "binary", function(err, file) {
      if(err) {        
        response.writeHead(500, {"Content-Type": "text/plain"});
        response.write(err + "\n");
        response.end();
        return;
      }

      response.writeHead(200);
      response.write(file, "binary");
      response.end();
    });
  });
}).listen(parseInt(port, 10));

console.log("Static file server running at\n  => http://localhost:" + port + "/\nCTRL + C to shutdown");

Обновить

Суть действительно обрабатывает файлы css и js. Сам использовал. Использование чтения / записи в «двоичном» режиме не проблема. Это просто означает, что файл не интерпретируется библиотекой файлов как текст и не связан с типом содержимого, возвращаемым в ответе.

Проблема с вашим кодом в том, что вы всегда возвращаете тип содержимого «текст / простой». Приведенный выше код не возвращает какой-либо тип содержимого, но если вы просто используете его для HTML, CSS и JS, браузер может легко вывести их. Нет лучше, чем неправильный тип содержания.

Обычно тип содержимого - это конфигурация вашего веб-сервера. Так что извините, если это не решит вашу проблему, но он работал для меня как простой сервер разработки и думал, что это может помочь другим людям. Если вам действительно нужны правильные типы содержимого в ответе, вам нужно либо явно определить их, как у joeytwiddle, либо использовать библиотеку, такую ​​как Connect, с разумными значениями по умолчанию. Приятно то, что он простой и самодостаточный (без зависимостей).

Но я чувствую вашу проблему. Итак, вот комбинированное решение.

var http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs")
    port = process.argv[2] || 8888;

http.createServer(function(request, response) {

  var uri = url.parse(request.url).pathname
    , filename = path.join(process.cwd(), uri);

  var contentTypesByExtension = {
    '.html': "text/html",
    '.css':  "text/css",
    '.js':   "text/javascript"
  };

  fs.exists(filename, function(exists) {
    if(!exists) {
      response.writeHead(404, {"Content-Type": "text/plain"});
      response.write("404 Not Found\n");
      response.end();
      return;
    }

    if (fs.statSync(filename).isDirectory()) filename += '/index.html';

    fs.readFile(filename, "binary", function(err, file) {
      if(err) {        
        response.writeHead(500, {"Content-Type": "text/plain"});
        response.write(err + "\n");
        response.end();
        return;
      }

      var headers = {};
      var contentType = contentTypesByExtension[path.extname(filename)];
      if (contentType) headers["Content-Type"] = contentType;
      response.writeHead(200, headers);
      response.write(file, "binary");
      response.end();
    });
  });
}).listen(parseInt(port, 10));

console.log("Static file server running at\n  => http://localhost:" + port + "/\nCTRL + C to shutdown");
person Jonathan Tran    schedule 29.11.2012
comment
На самом деле это не решает проблему. Вы возвращаете index.html в виде двоичного файла и не обрабатываете css и js. - person idophir; 30.11.2012
comment
Он обрабатывает css и js. Он не возвращает index.html как двоичный файл. Он просто копирует данные с диска в любом формате. Пожалуйста, смотрите обновления для получения дополнительных объяснений. - person Jonathan Tran; 30.11.2012
comment
одна проблема с кодом, он чувствителен к регистру, в unix для определенных файлов он дает 404 - person Pradeep; 15.11.2013
comment
Обратите внимание, что path.exists и path.existsSync теперь устарели. Пожалуйста, используйте fs.exists и fs.existsSync. stackoverflow.com/a/5008295/259 - person David Sykes; 03.04.2015
comment
Это далеко не лучшие ответы из всех приведенных здесь. Чистый node.js и все же простое решение - person Sergei Panfilov; 14.04.2016
comment
Обратите внимание, что fs.exists() также устарел. Поймайте ошибку на fs.stat(), а не создайте состояние гонки. - person Matt; 01.02.2017
comment
Также вы можете использовать mime.getType (filename) для определения типа содержимого - person lexa-b; 20.02.2018
comment
Спасибо. Я опубликовал https://www.npmjs.com/package/simplatic-http-server на основе решение, которое было предоставлено в этом ответе (в дополнение к некоторым изменениям и улучшениям). - person Mir-Ismaili; 13.07.2019
comment
его работа очень хорошо. также css и js. мы также можем использовать переключатель для разных файлов. - person zahra_shokri; 08.02.2021

Экспресс не нужен. Вам не нужно подключаться. Node.js делает http ЕСТЕСТВЕННО. Все, что вам нужно сделать, это вернуть файл, зависящий от запроса:

var http = require('http')
var url = require('url')
var fs = require('fs')

http.createServer(function (request, response) {
    var requestUrl = url.parse(request.url)    
    response.writeHead(200)
    fs.createReadStream(requestUrl.pathname).pipe(response)  // do NOT use fs's sync methods ANYWHERE on production (e.g readFileSync) 
}).listen(9615)    

Более полный пример, который гарантирует, что запросы не могут получить доступ к файлам в базовом каталоге и правильно обрабатывает ошибки:

var http = require('http')
var url = require('url')
var fs = require('fs')
var path = require('path')
var baseDirectory = __dirname   // or whatever base directory you want

var port = 9615

http.createServer(function (request, response) {
    try {
        var requestUrl = url.parse(request.url)

        // need to use path.normalize so people can't access directories underneath baseDirectory
        var fsPath = baseDirectory+path.normalize(requestUrl.pathname)

        var fileStream = fs.createReadStream(fsPath)
        fileStream.pipe(response)
        fileStream.on('open', function() {
             response.writeHead(200)
        })
        fileStream.on('error',function(e) {
             response.writeHead(404)     // assume the file doesn't exist
             response.end()
        })
   } catch(e) {
        response.writeHead(500)
        response.end()     // end the response so browsers don't hang
        console.log(e.stack)
   }
}).listen(port)

console.log("listening on port "+port)
person B T    schedule 14.10.2014
comment
Если я не ошибаюсь, это решение не заботится о типе кодировки, поэтому запросы HTML-страниц и изображений будут иметь одинаковую кодировку. Не так ли? - person idophir; 14.10.2014
comment
@idophir Чаще всего кодировка не имеет значения, браузеры определяют ее на основе используемых тегов html или другой информации, или они догадываются очень хорошо. Как уже упоминалось выше, отсутствие MIME-типа лучше неправильного. Вы, безусловно, можете использовать что-то вроде node-mime для определения типов файлов mime, но полностью совместимый с Интернетом http-сервер выходит за рамки этого вопроса. - person B T; 14.10.2014
comment
@BT, так что, чтобы запускать это постоянно, вы бы просто сделали что-то вроде nohup node thisfile.js или есть лучший подход? - person Rooster; 18.03.2015
comment
@Rooster Ничего особенного не нужно - просто node thisfile.js. Он будет работать, прослушивая новые соединения и возвращая новые результаты, пока либо A. не закроется сигналом, либо B. какая-нибудь сумасшедшая ошибка каким-то образом не вызовет завершение программы. - person B T; 18.03.2015
comment
@BT действительно. но если вы хотите закрыть свой терминал, но оставить узел работающим, есть ли альтернатива его отказу? возможно, какой-нибудь демон, который обрабатывает серверы узлов? - person Rooster; 18.03.2015
comment
О, я вижу. Их называют демонизаторами. Я не уверен, что nohup подходит для этого. Forever - популярный инструмент, и тот, который я использую сейчас, мне не нравится. Не уверен, что есть хорошие альтернативы, но навсегда сделает это за вас. - person B T; 18.03.2015
comment
@Rooster Другой известный демонизатор находится на github.com/Unitech/pm2. - person Travelling Man; 09.05.2015
comment
@Rooster - вы также можете попробовать systemd, который в наши дни является стандартным для всех основных вариантов Linux. Вы можете не только перезапустить приложение в случае фатального сбоя приложения, но и перезагрузить систему. rocketeer.be/articles/deploying-node-js-with-systemd - person B T; 13.05.2015
comment
Зачем звонить response.end() синхронно? С приведенным выше кодом я всегда получаю пустое тело. Но если я вызываю response.end в событии «finish», все работает как ожидалось: response.on('finish', response.end). - person Maxim; 12.04.2016
comment
@Maxim Ах да, я понимаю, что вы говорите. Это действительно похоже на логическую ошибку. Но вызов response.end по окончании ответа является избыточным - если вы получили событие завершения, оно уже закончилось, верно? Я исправил свой ответ, спасибо! - person B T; 13.04.2016
comment
@zeel Привет, я понял, что ни твой '.' ни решение, ни мое решение baseDirectory на самом деле не устранили проблему. Нормализация пути решает проблему, поэтому я добавил ее в свой обновленный ответ. - person B T; 13.04.2016
comment
// do NOT use fs's sync methods ANYWHERE on production (e.g readFileSync) Почему? Так ли это и в 2016 году? - person cat; 02.05.2016
comment
@cat Это всегда будет правдой. Причина в том, что любое использование синхронных функций останавливает ваш поток до завершения операции. Это снижает производительность программ с несколькими асинхронными продолжениями (как и любой веб-сервер). Если вам нужен синхронно выглядящий код без значительного снижения производительности, обратите внимание на волокна узлов. - person B T; 04.05.2016
comment
Мне больше всего нравится этот ответ, но есть две проблемы: 1) он возвращает 200, когда должен возвращать 404; чтобы исправить это, я вызываю writeHead (200) внутри обратного вызова open. 2) В случае ошибки сокет остается открытым; чтобы исправить это, я вызываю response.destroy () в обратном вызове error. - person Paul Brannan; 15.08.2017
comment
@PaulBrannan Исправлено 1. Для 2 response.end() не закрывает сокет? - person B T; 15.08.2017
comment
В более раннем тестировании кажется, что response.end () не закрывает сокет. Я попробовал еще раз сегодня, и это дает; Я, должно быть, раньше делал что-то не так. - person Paul Brannan; 06.09.2017
comment
НЕ ИСПОЛЬЗУЙТЕ методы синхронизации fs ВЕЗДЕ при производстве (например, readFileSync), если, конечно, вам не нужно и вы не понимаете последствий. :) - person Madbreaks; 07.12.2017
comment
Обратите внимание: если вам нужен еще более легкий тест, вы можете просто вернуть HTML-страницу в виде строки, а не загружать ее из файла. Также вы можете продолжать работу программы, даже если терминал завершает работу, запустив ее с помощью экрана в Linux, запустите терминал с помощью screen, затем введите свою команду, затем нажмите Ctrl + a , а затем Ctrl + d, чтобы отсоединить, ваша программа продолжит работу. Обратите внимание, что это не подходит для производства, потому что при отключении питания / перезагрузке системы ваша программа не перезапустится автоматически. - person jrh; 26.05.2019

Я думаю, что вам сейчас не хватает того, что вы отправляете:

Content-Type: text/plain

Если вы хотите, чтобы веб-браузер отображал HTML, вы должны изменить это на:

Content-Type: text/html
person clee    schedule 21.05.2011
comment
Спасибо за быстрый ответ. Теперь страница загружается, но без CSS. Как я могу получить стандартную HTML-страницу с загруженными CSS и JS? - person idophir; 22.05.2011
comment
Вам нужно начать расширять этот сервер. Прямо сейчас он знает только, как обслуживать index.html - вам нужно научить его, как обслуживать foo.css и foo.js прямо сейчас, с их собственными соответствующими типами MIME. - person clee; 22.05.2011
comment
Если вы не хотите обслуживать статические файлы, вы можете поместить свой css в тег <style>. - person Keith; 29.03.2016
comment
По прошествии девяти лет это действительно следует принять как правильный ответ. - person rooch84; 14.04.2020

Шаг 1 (внутри командной строки [надеюсь, вы перейдете в СВОЮ ПАПКУ]): npm install express

Шаг 2. Создайте файл server.js

var fs = require("fs");
var host = "127.0.0.1";
var port = 1337;
var express = require("express");

var app = express();
app.use(express.static(__dirname + "/public")); //use static files in ROOT/public folder

app.get("/", function(request, response){ //root dir
    response.send("Hello!!");
});

app.listen(port, host);

Обратите внимание, вы также должны добавить WATCHFILE (или использовать nodemon). Приведенный выше код предназначен только для простого сервера подключения.

ШАГ 3: node server.js или nodemon server.js

Теперь есть более простой способ, если вам просто нужен простой HTTP-сервер. npm install -g http-server

и откройте наш каталог и введите http-server

https://www.npmjs.org/package/http-server

person STEEL    schedule 24.02.2013
comment
@STEEL, есть ли способ автоматически запустить сервер узла. Я имею в виду, не переходя к пути к каталогу, а затем введите nodeserver, тогда только он запустится. Я хочу запустить сервер узла, например IIS. Можешь сказать мне - person Vinoth; 05.07.2017
comment
@Vinoth да, есть много способов. Какова ваша точная цель или цель, я могу вам помочь - person STEEL; 06.07.2017
comment
@steel Я хочу, чтобы сервер запускался автоматически, не указывая сервер узла в командной строке. это мое требование, возможно, вы можете рассказать мне какой-нибудь пример - person Vinoth; 06.07.2017
comment
Вам нужно будет использовать какой-то инструмент, например ThoughtWorks GO, который может выполнять команды терминала одним щелчком мыши в браузере. - person STEEL; 06.07.2017

Быстрый способ:

var express = require('express');
var app = express();
app.use('/', express.static(__dirname + '/../public')); // ← adjust
app.listen(3000, function() { console.log('listening'); });

Ваш путь:

var http = require('http');
var fs = require('fs');

http.createServer(function (req, res) {
    console.dir(req.url);

    // will get you  '/' or 'index.html' or 'css/styles.css' ...
    // • you need to isolate extension
    // • have a small mimetype lookup array/object
    // • only there and then reading the file
    // •  delivering it after setting the right content type

    res.writeHead(200, {'Content-Type': 'text/html'});

    res.end('ok');
}).listen(3001);
person Frank Nocke    schedule 07.02.2016

Я считаю, что лучше искать тип контента в словаре, чем иметь дело с оператором switch:

var contentTypesByExtension = {
    'html': "text/html",
    'js':   "text/javascript"
};

...

    var contentType = contentTypesByExtension[fileExtension] || 'text/plain';
person joeytwiddle    schedule 24.11.2011
comment
Да, выглядит намного элегантнее, чем решение переключателя, использованное Эриком Б. Соуэллом (см. Выбранный ответ). Спасибо. - person idophir; 08.12.2011
comment
Этот ответ полностью вне контекста ... Он относится к этой ссылке в этом комментарии - stackoverflow.com/questions/6084360/ (да, все равно, Интернет сломан) - person Mars Robertson; 14.09.2015

В основном это обновленная версия принятого ответа для версии подключения 3:

var connect = require('connect');
var serveStatic = require('serve-static');

var app = connect();

app.use(serveStatic(__dirname, {'index': ['index.html']}));
app.listen(3000);

Я также добавил параметр по умолчанию, чтобы index.html использовался по умолчанию.

person tomet    schedule 20.06.2014

Вам не нужно использовать какие-либо модули NPM для запуска простого сервера, для Node есть очень крошечная библиотека под названием «NPM Free Server»:

50 строк кода, выводит, если вы запрашиваете файл или папку, и дает им красный или зеленый цвет, если он не сработал. Размер менее 1 КБ (уменьшенный).

person Jaredcheeda    schedule 09.11.2015
comment
Прекрасный выбор. Обслуживает html, css, js и изображения. Отлично подходит для отладки. Просто замените этот код на свой server.js. - person pollaris; 26.08.2017
comment
Хотел бы я добавить больше голосов! Отлично! Я внес небольшое изменение var filename = path.join(process.cwd() + '/dist/', uri); в сервер из папки dist. Я помещаю код в server.js, и он просто работает, когда я набираю npm start - person John Henckel; 10.07.2018
comment
Как запустить его как службу, чтобы я мог использовать его, даже закрыв командную строку. Есть ли какой-нибудь инструмент, обеспечивающий такого рода, если не этот. - person Sandeep sandy; 09.08.2019

если на вашем ПК установлен узел, вероятно, у вас есть NPM, если вам не нужны материалы NodeJS, вы можете использовать serve для этого:

1 - Установите пакет на свой компьютер:

npm install -g serve

2 - Обслуживайте свою статическую папку:

serve <path> 
d:> serve d:\StaticSite

Он покажет вам, какой порт обслуживается вашей статической папкой, просто перейдите к хосту, например:

http://localhost:3000
person Diego Mendes    schedule 23.02.2017
comment
Как запустить его как службу, чтобы я мог использовать его, даже закрыв командную строку. Есть ли какой-нибудь инструмент, обеспечивающий такого рода, если не этот. - person Sandeep sandy; 09.08.2019
comment
Это должен быть принятый ответ. Потому что он самый простой и работает «из коробки». Таким образом, если вы запустите только serve без пути, он запустит сервер из текущей папки (той, в которой вы ранее записали компакт-диск). - person Игор Рајачић; 08.10.2019

Вы можете просто ввести их в свою оболочку

npx serve

Репо: https://github.com/zeit/serve.

person Geng Jiawen    schedule 06.05.2019
comment
Предоставляя вариант -s или --single, сервер перезаписывает все ненайденные запросы в index.html. Итак, npx serve -s работает так, как этого хотел ОП. - person z80crew; 13.01.2021

Я нашел интересную библиотеку на npm, которая может быть вам полезна. Это называется пантомима (npm install mime или https://github.com/broofa/node-mime) и может определять пантомиму тип файла. Вот пример написанного мной веб-сервера:

var mime = require("mime"),http = require("http"),fs = require("fs");
http.createServer(function (req, resp) {
path  = unescape(__dirname + req.url)
var code = 200
 if(fs.existsSync(path)) {
    if(fs.lstatSync(path).isDirectory()) {
        if(fs.existsSync(path+"index.html")) {
        path += "index.html"
        } else {
            code = 403
            resp.writeHead(code, {"Content-Type": "text/plain"});
            resp.end(code+" "+http.STATUS_CODES[code]+" "+req.url);
        }
    }
    resp.writeHead(code, {"Content-Type": mime.lookup(path)})
    fs.readFile(path, function (e, r) {
    resp.end(r);

})
} else {
    code = 404
    resp.writeHead(code, {"Content-Type":"text/plain"});
    resp.end(code+" "+http.STATUS_CODES[code]+" "+req.url);
}
console.log("GET "+code+" "+http.STATUS_CODES[code]+" "+req.url)
}).listen(9000,"localhost");
console.log("Listening at http://localhost:9000")

Он будет обслуживать любой обычный текстовый или графический файл (.html, .css, .js, .pdf, .jpg, .png, .m4a и .mp3 - это расширения, которые я тестировал, но теоретически он должен работать для всего)

Примечания разработчика

Вот пример вывода, который я получил с ним:

Listening at http://localhost:9000
GET 200 OK /cloud
GET 404 Not Found /cloud/favicon.ico
GET 200 OK /cloud/icon.png
GET 200 OK /
GET 200 OK /501.png
GET 200 OK /cloud/manifest.json
GET 200 OK /config.log
GET 200 OK /export1.png
GET 200 OK /Chrome3DGlasses.pdf
GET 200 OK /cloud
GET 200 OK /-1
GET 200 OK /Delta-Vs_for_inner_Solar_System.svg

Обратите внимание на функцию unescape в построении пути. Это позволяет использовать имена файлов с пробелами и закодированными символами.

person MayorMonty    schedule 08.06.2014

Редактировать:

Пример приложения Node.js Node Chat имеет нужную вам функциональность.
В нем README.textfile
3. Шаг - это то, что вы ищете.

шаг 1

  • создать сервер, который отвечает hello world на порту 8002

шаг 2

  • создать index.html и обслужить его

шаг 3

  • представить util.js
  • изменить логику, чтобы обслуживать любой статический файл
  • показать 404, если файл не найден

step4

  • добавить jquery-1.4.2.js
  • добавить client.js
  • измените index.html, чтобы запрашивать у пользователя псевдоним

Вот server.js

Вот util.js

person Kerem Baydoğan    schedule 21.05.2011
comment
Мне все равно. У меня только index.html. Я просто хочу загрузить html + css + js. Спасибо! - person idophir; 22.05.2011
comment
-1 для .readFileSync в обратном вызове. В node.js мы используем неблокирующий ввод-вывод. Пожалуйста, не рекомендуйте Sync команды. - person Raynos; 22.05.2011
comment
Привет @krmby, спасибо за попытку помочь. Я действительно новичок в этом. Я скачал и server.js, и util.js. Когда я запускаю node server.js и пытаюсь получить доступ к странице с помощью браузера, я получаю следующую ошибку: TypeError: Object # ‹ServerResponse› не имеет метода закрытия в /var/www/hppy-site/util.js:67 : 8 в /var/www/hppy-site/util.js:56:4 в [object Object]. ‹Anonymous› (fs.js: 107: 5) в [object Object] .emit (events.js: 61 : 17) в afterRead (fs.js: 970: 12) в оболочке (fs.js: 245: 17) Есть идеи? Кстати, то же самое происходит, когда я загружаю ваш проект и запускаю его. - person idophir; 22.05.2011
comment
Извините. Я использовал новую версию. Заменен res.close () на res.end () - person idophir; 22.05.2011

Я делаю это, прежде всего, глобально установить статический сервер узла через

npm install node-static -g

затем перейдите в каталог, содержащий ваши html-файлы, и запустите статический сервер с static.

Зайдите в браузер и введите localhost:8080/"yourHtmlFile".

person Samba    schedule 02.02.2016
comment
Ничто не сравнится с однострочником. Спасибо! - person AndroidDev; 12.09.2018
comment
Как запустить его как службу, чтобы я мог использовать его, даже закрыв командную строку. Есть ли какой-нибудь инструмент, обеспечивающий такого рода, если не этот. - person Sandeep sandy; 09.08.2019

var http = require('http');
var fs = require('fs');
var index = fs.readFileSync('index.html');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    // change the to 'text/plain' to 'text/html' it will work as your index page
    res.end(index);
}).listen(9615);

Я думаю, вы искали это. В вашем index.html просто заполните его обычным html-кодом - все, что вы хотите отобразить на нем, например:

<html>
    <h1>Hello world</h1>
</html>
person Ashish Ranjan    schedule 30.12.2014

В основном копирование принятого ответа, но избегание создания файла js.

$ node
> var connect = require('connect'); connect().use(static('.')).listen(8000);

Было очень удобно.

Обновлять

В последней версии Express serve-static стал отдельным промежуточным программным обеспечением. Используйте это, чтобы служить:

require('http').createServer(require('serve-static')('.')).listen(3000)

Сначала установите serve-static.

person Devs love ZenUML    schedule 17.06.2014

Я использую приведенный ниже код для запуска простого веб-сервера, который отображает html-файл по умолчанию, если в URL-адресе нет файла.

var http = require('http'),
fs = require('fs'),
url = require('url'),
rootFolder = '/views/',
defaultFileName = '/views/5 Tips on improving Programming Logic   Geek Files.htm';


http.createServer(function(req, res){

    var fileName = url.parse(req.url).pathname;
    // If no file name in Url, use default file name
    fileName = (fileName == "/") ? defaultFileName : rootFolder + fileName;

    fs.readFile(__dirname + decodeURIComponent(fileName), 'binary',function(err, content){
        if (content != null && content != '' ){
            res.writeHead(200,{'Content-Length':content.length});
            res.write(content);
        }
        res.end();
    });

}).listen(8800);

Он отобразит все файлы js, css и изображения вместе со всем содержимым html.

Согласитесь с утверждением "Нет лучше неправильного типа содержания"

person Sachin303    schedule 24.03.2014

из w3schools

довольно легко создать сервер узла для обслуживания любого запрошенного файла, и вам не нужно устанавливать для него какие-либо пакеты

var http = require('http');
var url = require('url');
var fs = require('fs');

http.createServer(function (req, res) {
  var q = url.parse(req.url, true);
  var filename = "." + q.pathname;
  fs.readFile(filename, function(err, data) {
    if (err) {
      res.writeHead(404, {'Content-Type': 'text/html'});
      return res.end("404 Not Found");
    }  
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data);
    return res.end();
  });
}).listen(8080);

http://localhost:8080/file.html

будет обслуживать file.html с диска

person Ahmed M. Matar    schedule 25.10.2018

Я не уверен, что это именно то, что вы хотели, однако вы можете попробовать изменить:

{'Content-Type': 'text/plain'}

к этому:

{'Content-Type': 'text/html'}

Это заставит клиент браузера отображать файл как html вместо обычного текста.

person Xenry    schedule 30.08.2015
comment
Разве это не то же самое, что существующий ответ ? - person Pang; 31.08.2015

Экспресс-функция sendFile делает именно то, что вам нужно, и, поскольку вам нужна функциональность веб-сервера от узла, экспресс является естественным выбором, и тогда обслуживание статических файлов становится таким же простым, как:

res.sendFile('/path_to_your/index.html')

подробнее читайте здесь: https://expressjs.com/en/api.html#res.sendFile

Небольшой пример с экспресс-веб-сервером для узла:

var express = require('express');
var app = express();
var path = require('path');

app.get('/', function(req, res) {
    res.sendFile(path.join(__dirname + '/index.html'));
});

app.listen(8080);

запустите это и перейдите к http://localhost:8080

Чтобы расширить это, чтобы вы могли обслуживать статические файлы, такие как css и изображения, вот еще один пример:

var express = require('express');
var app = express();
var path = require('path');

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

app.get('/', function(req, res) {
    res.sendFile(path.join(__dirname + '/index.html'));
});

app.listen(8080);

поэтому создайте подпапку css, поместите в нее свой статический контент, и он будет доступен в вашем index.html для удобства, например:

<link type="text/css" rel="stylesheet" href="/css/style.css" />

Обратите внимание на относительный путь в href!

вуаля!

person Mladen Oršolić    schedule 06.12.2019

Немного более подробная экспресс-версия 4.x, но обеспечивающая перечисление каталогов, сжатие, кеширование и ведение журнала запросов в минимальном количестве строк.

var express = require('express');
var compress = require('compression');
var directory = require('serve-index');
var morgan = require('morgan'); //logging for express

var app = express();

var oneDay = 86400000;

app.use(compress());
app.use(morgan());
app.use(express.static('filesdir', { maxAge: oneDay }));
app.use(directory('filesdir', {'icons': true}))

app.listen(process.env.PORT || 8000);

console.log("Ready To serve files !")
person Bruno Grieder    schedule 01.07.2014

Безумное количество сложных ответов. Если вы не собираетесь обрабатывать файлы / базу данных nodeJS, а просто хотите обслуживать статические html / css / js / images, как предлагает ваш вопрос, просто установите pushstate-server или аналогичный;

Вот «один лайнер», который создаст и запустит мини-сайт. Просто вставьте весь этот блок в свой терминал в соответствующий каталог.

mkdir mysite; \
cd mysite; \
npm install pushstate-server --save; \
mkdir app; \
touch app/index.html; \
echo '<h1>Hello World</h1>' > app/index.html; \
touch server.js; \
echo "var server = require('pushstate-server');server.start({ port: 3000, directory: './app' });" > server.js; \
node server.js

Откройте браузер и перейдите по адресу http://localhost:3000. Выполнено.

Сервер будет использовать каталог app в качестве корневого каталога для обслуживания файлов. Чтобы добавить дополнительные ресурсы, просто поместите их в этот каталог.

person cyberwombat    schedule 03.08.2015
comment
Если у вас уже есть статика, вы можете просто использовать следующее: npm install pushstate-server --save; touch server.js; echo "var server = require('pushstate-server');server.start({ port: 3000, directory: './' });" > server.js; node server.js - person Swivel; 28.08.2015

Уже есть отличные решения для простого nodejs server. Есть еще одно решение, если вам нужно live-reloading, когда вы вносите изменения в свои файлы.

npm install lite-server -g

перейдите в свой каталог и сделайте

lite-server

он откроет для вас браузер с перезагрузкой в ​​реальном времени.

person lokeshjain2008    schedule 01.05.2017

Большинство ответов выше очень хорошо описывают, как обслуживается содержимое. Что я искал как дополнительный, так это перечисление каталога, чтобы можно было просматривать другое содержимое каталога. Вот мое решение для дальнейших читателей:

'use strict';

var finalhandler = require('finalhandler');
var http = require('http');
var serveIndex = require('serve-index');
var serveStatic = require('serve-static');
var appRootDir = require('app-root-dir').get();
var log = require(appRootDir + '/log/bunyan.js');

var PORT = process.env.port || 8097;

// Serve directory indexes for reports folder (with icons)
var index = serveIndex('reports/', {'icons': true});

// Serve up files under the folder
var serve = serveStatic('reports/');

// Create server
var server = http.createServer(function onRequest(req, res){
    var done = finalhandler(req, res);
    serve(req, res, function onNext(err) {
    if (err)
        return done(err);
    index(req, res, done);
    })
});


server.listen(PORT, log.info('Server listening on: ', PORT));
person Abu Shumon    schedule 31.12.2016

Более простая версия, с которой я столкнулся, выглядит следующим образом. Это лучше всего для образовательных целей, поскольку в нем не используются абстрактные библиотеки.

var http = require('http'),
url = require('url'),
path = require('path'),
fs = require('fs');

var mimeTypes = {
  "html": "text/html",
  "mp3":"audio/mpeg",
  "mp4":"video/mp4",
  "jpeg": "image/jpeg",
  "jpg": "image/jpeg",
  "png": "image/png",
  "js": "text/javascript",
  "css": "text/css"};

http.createServer(function(req, res) {
    var uri = url.parse(req.url).pathname;
    var filename = path.join(process.cwd(), uri);
    fs.exists(filename, function(exists) {
        if(!exists) {
            console.log("not exists: " + filename);
            res.writeHead(200, {'Content-Type': 'text/plain'});
            res.write('404 Not Found\n');
            res.end();
            return;
        }
        var mimeType = mimeTypes[path.extname(filename).split(".")[1]];
        res.writeHead(200, {'Content-Type':mimeType});

        var fileStream = fs.createReadStream(filename);
        fileStream.pipe(res);

    }); //end path.exists
}).listen(1337);

Теперь перейдите в браузер и откройте следующее:

http://127.0.0.1/image.jpg

Здесь image.jpg должен находиться в том же каталоге, что и этот файл. Надеюсь, это кому-то поможет :)

person Kaushal28    schedule 30.05.2017
comment
Вы не должны угадывать тип пантомимы по имени файла. - person mwieczorek; 19.11.2018
comment
Примечание: fs.exists () устарела, fs.existsSync () является прямой заменой. - person JWAspin; 20.02.2019
comment
@mwieczorek как его угадывать? Вы пропустили, что он отщепляет расширение файла? - person James Newton; 14.08.2019
comment
Возможно, вы захотите использовать: let mimeType = mimeTypes [filename.split (.). Pop ()] || приложение / октет-поток - person James Newton; 14.08.2019

Определенно стоит взглянуть на локальный веб-сервер! Вот отрывок из ридми:

локальный веб-сервер

Компактный модульный веб-сервер для быстрой полнофункциональной разработки.

  • Поддерживает HTTP, HTTPS и HTTP2.
  • Маленький и на 100% персонализированный. Загружайте и используйте только то поведение, которое требуется для вашего проекта.
  • Прикрепите настраиваемый вид, чтобы персонализировать визуализацию деятельности.
  • Программные интерфейсы и интерфейсы командной строки.

Используйте этот инструмент, чтобы:

  • Создавайте интерфейсные веб-приложения любого типа (статические, динамические, одностраничные, прогрессивные веб-приложения, React и т. Д.).
  • Прототип серверной службы (REST API, микросервис, веб-сокет, служба событий, отправленных сервером и т. Д.).
  • Отслеживайте активность, анализируйте производительность, экспериментируйте со стратегией кеширования и т. Д.

Локальный веб-сервер - это распространение lws в комплекте с «стартовым пакетом» полезного промежуточного программного обеспечения.

Синопсис

Этот пакет устанавливает инструмент командной строки ws (ознакомьтесь с использованием руководство).

Статический веб-сайт

Запуск ws без аргументов приведет к размещению текущего каталога как статического веб-сайта. При переходе к серверу отобразится список каталогов или ваш index.html, если этот файл существует.

$ ws
Listening on http://mbp.local:8000, http://127.0.0.1:8000, http://192.168.0.100:8000

Руководство по статическим файлам.

В этом ролике демонстрируется статический хостинг плюс пара форматов вывода журнала - dev и stats.

Одностраничное приложение

Serving a Single Page Application (an app with client-side routing, e.g. a React or Angular app) is as trivial as specifying the name of your single page:

$ ws --spa index.html

Для статического сайта запросы на типичные пути SPA (например, /user/1, /login) вернут 404 Not Found, поскольку файл в этом месте не существует. Однако, помечая index.html как SPA, вы создаете это правило:

Если запрошен статический файл (например, /css/style.css), тогда обслуживайте его, если нет (например, /login), то обслуживайте указанный SPA и обрабатывайте маршрут на стороне клиента.

SPA, руководство.

Перезапись URL и прокси-запросы

Другой распространенный вариант использования - пересылка определенных запросов на удаленный сервер.

Следующая команда передает запросы сообщений в блоге по любому пути, начинающемуся с /posts/ до https://jsonplaceholder.typicode.com/posts/. Например, запрос на /posts/1 будет проксирован на https://jsonplaceholder.typicode.com/posts/1.

$ ws --rewrite '/posts/(.*) -> https://jsonplaceholder.typicode.com/posts/$1'

Руководство по перезаписи.

Этот клип демонстрирует вышесказанное плюс использование --static.extensions для указания расширения файла по умолчанию и --verbose для отслеживания активности.

HTTPS и HTTP2

For HTTPS or HTTP2, pass the --https or --http2 flags respectively. See the wiki for further configuration options and a guide on how to get the "green padlock" in your browser.

$ lws --http2
Listening at https://mba4.local:8000, https://127.0.0.1:8000, https://192.168.0.200:8000
person Lloyd    schedule 25.06.2019


Это одно из самых быстрых решений, которые я использую для быстрого просмотра веб-страниц.

sudo npm install ripple-emulator -g

С этого момента просто войдите в каталог ваших html-файлов и запустите

ripple emulate

затем измените устройство на Nexus 7 в альбомной ориентации.

person Post Impatica    schedule 10.07.2015
comment
Что с этим делать Nexus 7? - person waeltken; 09.12.2015

Я также могу порекомендовать SugoiJS, он очень прост в настройке, дает возможность быстро начать писать и имеет отличные функции.

Чтобы начать работу, загляните сюда: http://demo.sugoijs.com/, документация: https://wiki.sugoijs.com/

Он имеет декораторы обработки запросов, политики запросов и декораторы политик авторизации.

Например:

import {Controller,Response,HttpGet,RequestParam} from "@sugoi/server";
​
@Controller('/dashboard')
export class CoreController{
    constructor(){}
​
    @HttpGet("/:role")
    test(@RequestParam('role') role:string,
         @RequestHeader("role") headerRole:string){
        if(role === headerRole )
            return "authorized";
        else{
            throw new Error("unauthorized")
        }
    }
}
person Gen4ik    schedule 08.01.2019

Это очень просто с множеством представленных сегодня библиотек. Ответы здесь функциональные. Если вам нужна другая версия для более быстрого и простого запуска

Конечно, сначала установите node.js. Потом:

> # module with zero dependencies
> npm install -g @kawix/core@latest 
> # change /path/to/static with your folder or empty for current
> kwcore "https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express-static.js" /path/to/static

Здесь содержимое "https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express-static.js "(вам не нужно загружать его, я опубликовал, чтобы понять, как работает)

// you can use like this:
// kwcore "https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express.js" /path/to/static
// kwcore "https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express.js" 

// this will download the npm module and make a local cache
import express from 'npm://express@^4.16.4'
import Path from 'path'

var folder= process.argv[2] || "."
folder= Path.resolve(process.cwd(), folder)
console.log("Using folder as public: " + folder)

var app = express() 
app.use(express.static(folder)) 
app.listen(8181)
console.log("Listening on 8181")
person James Suárez    schedule 02.03.2019

Создайте простой веб-сервер Node.js и асинхронно обслуживайте HTML-страницу из файла

Создавая свой первый сервер node.js, я нашел простой и эффективный способ сделать это.

Вместо того, чтобы загружать HTML для каждого запроса, мы можем загрузить его один раз в начале. Затем верните данные, которые мы загрузили при запуске.

const host = "localhost";
const port = 5000;
const http = require("HTTP");
const fs = require("fs").promises;

let htmlFile;
const reqListenerFunc = function (req, resp) {
    resp.setHeader("Content-Type", "text/html");
    resp.writeHead(200);
    resp.end(htmlFile);
};
const simpleServer = http.createServer(reqListenerFunc);

// // Using Arrow function directly
// const simpleServer = http.createServer( (req, resp) => {
//     resp.setHeader("Content-Type", "text/html");
//     resp.writeHead(200);
//     resp.end(htmlFile);
// });

fs.readFile(__dirname + "/index.html")
    .then(content => {
        htmlFile = content;
        simpleServer.listen(port, host, () => {
            console.log(`Node.js web server is running on http://${host}:${port}`);
        });
    })
    .catch(err => {
        console.error(`Cannot read index.html file. <br> Error: ${err}`);
        process.exit(1);
    });

Подробнее: https://www.digitalocean.com/community/tutorials/how-to-create-a-web-server-in-node-js-with-the-http-module

person Okiemute Gold    schedule 07.04.2021

person    schedule
comment
Content-Type должен быть text/html, как он определен таким образом: Content-Type := type "/" subtype *[";" parameter] . - person t.niese; 16.03.2014
comment
похоже, это превращает все мои файлы в этой папке в тип html, даже если это js ... - person ahnbizcad; 05.06.2016