Быстрый файловый сервер Node.js (статические файлы по HTTP)


642

Существует ли готовый к использованию инструмент Node.js (установлен с npm), который помог бы мне представить содержимое папки как файловый сервер через HTTP.

Пример, если у меня есть

D:\Folder\file.zip
D:\Folder\file2.html
D:\Folder\folder\file-in-folder.jpg

Затем, начиная с, D:\Folder\ node node-file-server.js я мог получить доступ к файлу через

http://hostname/file.zip
http://hostname/file2.html
http://hostname/folder/file-in-folder.jpg

Почему статический файловый сервер моего узла отбрасывает запросы? ссылаться на некоторые мистические

стандартный файловый сервер node.js

Если такого инструмента нет, какой фреймворк мне использовать?

Связанный: Базовый статический файловый сервер в NodeJS


Я написал модуль под названием Cachemere, который позволяет вам сделать это. Он также автоматически кэширует все ваши ресурсы. Проверьте это: github.com/topcloud/cachemere
Джон

npmjs.com/package/local-web-server - легкий статический веб-сервер, нулевая конфигурация
Виктор

Ответы:


1092

Хорошим вариантом «готового к использованию инструмента» может быть http-сервер:

npm install http-server -g

Чтобы использовать это:

cd D:\Folder
http-server

Или вот так:

http-server D:\Folder

Проверьте это: https://github.com/nodeapps/http-server


10
Это круто. Мне нужно было указать адрес bc по какой-то причине, по умолчанию 0.0.0.0 не взаимодействовал с моей средой разработки. http-server -a localhostполучил дун.
Сэм Берри

41
я используюhttp-server -a localhost -p 80
Мухаммед Умер

10
Стоит проверить синхронизацию браузера , которая может делать более или менее то же самое, но с дополнительным бонусом обновления в реальном времени при изменении файлов.
Ник Ф

3
--cors отправлять Access-Control-Allow-Origin:* вместе с заголовками ответа (т. е. при передаче файла
Даниэль Ф

9
npx http-server- npx превращает его в однострочник, который загружает необходимые файлы и запускает его.
Майк Маккей,

186

Если вы не хотите использовать готовый инструмент, вы можете использовать приведенный ниже код, как я продемонстрировал на https://developer.mozilla.org/en-US/docs/Node_server_without_framework :

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

http.createServer(function (request, response) {
    console.log('request starting...');

    var filePath = '.' + request.url;
    if (filePath == './')
        filePath = './index.html';

    var extname = path.extname(filePath);
    var contentType = 'text/html';
    switch (extname) {
        case '.js':
            contentType = 'text/javascript';
            break;
        case '.css':
            contentType = 'text/css';
            break;
        case '.json':
            contentType = 'application/json';
            break;
        case '.png':
            contentType = 'image/png';
            break;      
        case '.jpg':
            contentType = 'image/jpg';
            break;
        case '.wav':
            contentType = 'audio/wav';
            break;
    }

    fs.readFile(filePath, function(error, content) {
        if (error) {
            if(error.code == 'ENOENT'){
                fs.readFile('./404.html', function(error, content) {
                    response.writeHead(200, { 'Content-Type': contentType });
                    response.end(content, 'utf-8');
                });
            }
            else {
                response.writeHead(500);
                response.end('Sorry, check with the site admin for error: '+error.code+' ..\n');
                response.end(); 
            }
        }
        else {
            response.writeHead(200, { 'Content-Type': contentType });
            response.end(content, 'utf-8');
        }
    });

}).listen(8125);
console.log('Server running at http://127.0.0.1:8125/');

ОБНОВЛЕНИЕ Если вам нужен доступ к вашему серверу из внешнего запроса / файла, вам нужно преодолеть CORS в файле node.js, написав ниже, как я уже упоминал в предыдущем ответе здесь

// Website you wish to allow to connect
response.setHeader('Access-Control-Allow-Origin', '*');

// Request methods you wish to allow
response.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

// Request headers you wish to allow
response.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
response.setHeader('Access-Control-Allow-Credentials', true);

ОБНОВИТЬ

Как отметил Адриан, в комментариях он написал код ES6 с полным объяснением. здесь , я просто повторно разместить свой код , приведенный ниже, в случае , если код ушел с оригинального сайта по любой причине:

const http = require('http');
const url = require('url');
const fs = require('fs');
const path = require('path');
const port = process.argv[2] || 9000;

http.createServer(function (req, res) {
  console.log(`${req.method} ${req.url}`);

  // parse URL
  const parsedUrl = url.parse(req.url);
  // extract URL path
  let pathname = `.${parsedUrl.pathname}`;
  // based on the URL path, extract the file extention. e.g. .js, .doc, ...
  const ext = path.parse(pathname).ext;
  // maps file extention to MIME typere
  const map = {
    '.ico': 'image/x-icon',
    '.html': 'text/html',
    '.js': 'text/javascript',
    '.json': 'application/json',
    '.css': 'text/css',
    '.png': 'image/png',
    '.jpg': 'image/jpeg',
    '.wav': 'audio/wav',
    '.mp3': 'audio/mpeg',
    '.svg': 'image/svg+xml',
    '.pdf': 'application/pdf',
    '.doc': 'application/msword'
  };

  fs.exists(pathname, function (exist) {
    if(!exist) {
      // if the file is not found, return 404
      res.statusCode = 404;
      res.end(`File ${pathname} not found!`);
      return;
    }

    // if is a directory search for index file matching the extention
    if (fs.statSync(pathname).isDirectory()) pathname += '/index' + ext;

    // read file from file system
    fs.readFile(pathname, function(err, data){
      if(err){
        res.statusCode = 500;
        res.end(`Error getting the file: ${err}.`);
      } else {
        // if the file is found, set Content-type and send data
        res.setHeader('Content-type', map[ext] || 'text/plain' );
        res.end(data);
      }
    });
  });


}).listen(parseInt(port));

console.log(`Server listening on port ${port}`);

2
Конечно, response.writeHead(200должно быть response.writeHead(404;)
Томас Хантер II

14
Разве этот код не позволяет подниматься по дереву файлов, делая что-то вроде 127.0.0.1/../../../etc/passwd ? Я не вижу никаких проверок против этого.
Рольф

3
Если кому-то интересна версия ES6 +, я создал статический файловый сервер, который обрабатывает MIME-типы: gist.github.com/amejiarosario/53afae82e18db30dadc9bc39035778e5
Адриан

1
@Adrian Этот код очень классный, но я нашел способ получить root-доступ с ним. Решение состоит в том, чтобы ограничить количество ведущих периодов в имени файла одним, чтобы вы ничего не могли сделать ../../etc/password. gist.github.com/amejiarosario/53afae82e18db30dadc9bc39035778e5
Сеф Рид,

1
pathname = pathname.replace(/^(\.)+/, '.');
Сеф Рид

79

Для людей, которые хотят запустить сервер из скрипта NodeJS:

Вы можете использовать expressjs / serve-static, который заменяет connect.static(который больше не доступен с connect 3):

myapp.js:

var http = require('http');

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

var serve = serveStatic("./");

var server = http.createServer(function(req, res) {
  var done = finalhandler(req, res);
  serve(req, res, done);
});

server.listen(8000);

а затем из командной строки:

  • $ npm install finalhandler serve-static
  • $ node myapp.js

1
К вашему сведению, это не сработало для меня. Я установил filehandler используя npm install filehandlerи пакет указан в node_modulesкаталоге. Но когда я запускаю myapp.jsузел, выдает ошибку, говоря Error: cannot find module filehandler. Если я закомментирую обязательный ststment для загрузки обработчика файлов, приложение прекрасно загружает serve-static, поэтому похоже, что с пакетом filhandler что-то не так. Сегодня 12 декабря 2014 года, поэтому, возможно, пакет изменился с момента публикации этого ответа?
Ли Дженкинс

7
Это не finalобработчикfile
jakub.g

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

59

Я знаю, что это не Node, но я использовал Python's SimpleHTTPServer:

python -m SimpleHTTPServer [port]

Он хорошо работает и поставляется с Python.


16
Эквивалент Python3: python -m http.server [port](упомянутый для Python2)
jakub.g

Python терпит неудачу для меня, когда речь идет об обслуживании больших файлов, таких как образы ОС. Fedora 23
Zimy

9
А на PHP:php -S localhost:8000
Дэннис

Я использую это для быстрой подачи контента из папки все время.
Адриан Линч

33

подключения может быть то, что вы ищете.

Легко устанавливается с:

npm install connect

Тогда самый простой статический файловый сервер может быть записан как:

var connect = require('connect'),
    directory = '/path/to/Folder';

connect()
    .use(connect.static(directory))
    .listen(80);

console.log('Listening on port 80.');

4
Это не работает больше с connect 3, поскольку это не выставляет connect.static; см. мой ответ ниже для замены
jakub.g

4
Я полагаю, что он все еще связан с Express по умолчанию, но действительно существует сейчас в отдельном requireспособном модуле «serve-static».
Олег

18

Установите экспресс, используя npm: https://expressjs.com/en/starter/install.html

Создайте файл с именем server.js на том же уровне вашего index.html с этим содержанием:

var express = require('express');
var server = express();
server.use('/', express.static(__dirname + '/'));
server.listen(8080);

Если вы хотите поместить его в другое место, укажите путь в третьей строке:

server.use('/', express.static(__dirname + '/public'));

CD к папке, содержащей ваш файл и запустить узел из консоли с этой командой:

node server.js

Просмотреть до localhost: 8080


1
Привет, я могу запустить его правильно, но это показывает Cannot GET /. Я использую AWS EC2 для запуска сервера.
Вэй Ся

1
@ Привет, поздний ответ. Из того, что я вижу из быстрого поиска в Google, похоже, что ваша структура каталогов может быть неправильной. В указанном вами месте должен быть файл index.html. Настройка приведенного выше примера для запуска должна занять 5 минут, и я дважды проверил, работает ли он как есть. Оттуда вы можете настроить путь в соответствии со своей структурой каталогов и убедиться, что сервер все еще находит нужные ему файлы.
pasx

path.join(__dirname, 'public')более кроссплатформенный.
sdgfsdh

17

One-line ™ Доказательства вместо обещаний

введите описание изображения здесь

Во-первых http-server, hs- ссылка

npm i -g http-server   // install
hs C:\repos            // run with one line?? FTW!!

Второй serveот ZEIT.co - ссылка

npm i -g serve         // install
serve C:\repos         // run with one line?? FTW!!

Ниже приведены доступные варианты, если это то, что поможет вам решить.

C: \ Users \ Qwerty> http-сервер --help
использование: http-сервер [путь] [параметры]

опции:
  -p порт для использования [8080]
  -a Адрес для использования [0.0.0.0]
  -d Показать каталоги [true]
  -i Показать autoIndex [true]
  -g --gzip Служить gzip-файлам, когда это возможно [false]
  -e --ext Расширение файла по умолчанию, если не указано [нет]
  -s --silent Подавить сообщения журнала от вывода
  --cors [= headers] Включить CORS через заголовок «Access-Control-Allow-Origin»
                     При желании укажите список заголовков CORS, разделенных запятыми
  -o [путь] Открыть окно браузера после запуска сервера
  -c время кеширования (максимальный возраст) в секундах [3600], например, -c10 в течение 10 секунд.
               Чтобы отключить кеширование, используйте -c-1.
  -U --utc Использовать формат времени UTC в сообщениях журнала.

  -P --proxy Резервный прокси, если запрос не может быть разрешен. например: http://someurl.com

  -S --ssl Включить https.
  -C --cert Путь к ssl-файлу сертификата (по умолчанию: cert.pem).
  -K --key Путь к файлу ключа ssl (по умолчанию: key.pem).

  -r --robots Ответить на /robots.txt [User-agent: * \ nDisallow: /]
  -h --help Распечатать этот список и выйти.
C: \ Users \ Qwerty> serve --help

  Использование: serve.js [параметры] [команда]

  Команды:

    справка Показать справку

  Опции:

    -a, --auth Служить базовому аутентификации
    -c, --cache Время в миллисекундах для кэширования файлов в браузере
    -n, --clipless Не копировать адрес в буфер обмена (по умолчанию отключено)
    -C, --cors Setup * CORS-заголовки, чтобы разрешать запросы из любого источника (по умолчанию отключено)
    -h, --help Вывод информации об использовании
    -i, --ignore Файлы и каталоги игнорировать
    -o, --open Открыть локальный адрес в браузере (по умолчанию отключено)
    -p, --port Port для прослушивания (по умолчанию 5000)
    -S, --silent Ничего не регистрировать на консоли
    -s, --single Служить одностраничным приложениям (устанавливает `-c` на 1 день)
    -t, --treeless Не отображать дерево статики (по умолчанию отключено)
    -u, --unzipped Отключить сжатие GZIP
    -v, --version Вывести номер версии

Если вам нужно следить за изменениями, посмотрите hostr, отметьте ответ Генри Ценга


14

ТОЛЬКО ДЕМО / ПРОТО СЕРВЕР

Если это все, что вам нужно, попробуйте это:

const http = require('http');
const fs = require('fs');
const port = 3000;
const app = http.createServer((req,res) => {
    res.writeHead(200);
    if (req.url === '/') req.url = '/index.html'; // courtesy of @JosephCho
    res.end(fs.readFileSync(__dirname + req.url));
});

app.listen(port);

примечание: вам нужно использовать «/index.html» как часть вашего адреса, т.е. « http: // localhost: 3000 / index.html »


2
Не используйте версию синхронизации. Instread создать канал для res из readStream.
Эдуард Бондаренко

1
Лучший ответ, если вам нужен быстрый и грязный одноразовый пони.
Коллапсар

1
Если вы хотите избежать использования в index.htmlкачестве части своего адреса, просто добавьте if (req.url === '/') req.url = '/index.html';сразу после res.writeHead(200);.
Джозеф Чо

3
@ Эдуард Бондаренко прав. const stream = fs.createReadStream(...); stream.pipe(res);это все, что вам нужно
Джастин Майнерс

8

Есть еще один неплохой статический веб-сервер: браузер-синхронизация.

Его можно скачать с помощью менеджера пакетов узла:

npm install -g browser-sync

После установки перейдите к папке проекта в командной строке cmd и просто выполните следующее:

browser-sync start --server --port 3001 --files="./*"

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

Больше можно узнать из BrowserSync

Спасибо.


2
Преимущество использования Browsersync по сравнению с другими статическими серверами состоит в том, что он обновляет страницу в режиме реального времени всякий раз, когда --filesизменяются файлы, указанные в флаге (примечание: указывать не нужно ./*- только те, которые вы хотите, чтобы Browsersync активно следил за обновлениями, например, . css/*.css)
Ник Ф

7

Мне не очень повезло с любым из ответов на этой странице, однако, ниже, казалось, добился цели.

Добавьте server.jsфайл со следующим содержанием:

const express = require('express')
const path = require('path')
const port = process.env.PORT || 3000
const app = express()

// serve static assets normally
app.use(express.static(__dirname + '/dist'))

// handle every other route with index.html, which will contain
// a script tag to your application's JavaScript file(s).
app.get('*', function (request, response){
  response.sendFile(path.resolve(__dirname, 'dist', 'index.html'))
})

app.listen(port)
console.log("server started on port " + port)

Также убедитесь, что вам требуется express. Запустите yarn add express --saveили в npm install express --saveзависимости от вашей настройки (я могу порекомендовать yarnэто довольно быстро).

Вы можете перейти distв любую папку, в которой вы размещаете свой контент. Для моего простого проекта я не служил ни в одной папке, поэтому я просто удалил distимя файла.

Тогда вы можете бежать node server.js. Поскольку я должен был загрузить свой проект на сервер Heroku, мне нужно было добавить следующее в мой package.jsonфайл:

  "scripts": {
    "start": "node server.js"
  }

6

Если вы используете платформу Express , эта функциональность готова к работе.

Чтобы настроить простое приложение для работы с файлами, просто сделайте это:

mkdir yourapp
cd yourapp
npm install express
node_modules/express/bin/express

Могу ли я $ npm установить -g express; их $ экспресс?
Пол Верест

Я выполнил ваши действия, но в моем экспрессе нет папки bin
Qwerty

6

Вот мой любимый проект с однофайловым / легковесным файловым веб-сервером node.js, не имеющий зависимости, который, я считаю, является быстрым и многофункциональным инструментом, использовать его так же просто, как выполнить эту команду на вашем терминале Linux / Unix / macOS ( или termux на Android), когда установлен node.js (или nodejs-legacyна Debian / Ubuntu):

curl pad.js.org | node 

(существуют разные команды для пользователей Windows в документации)

Он поддерживает разные вещи, которые я считаю полезными,

  • Создание / обслуживание индекса иерархического каталога
    • С возможностью сортировки по различным критериям
    • Загрузка из браузера с помощью функции [multi-file] drag-and-drop и копирование-вставка из файла / текста и вставка снимка экрана из системного буфера обмена в Chrome, Firefox и других браузерах может иметь некоторые ограничения (которые можно отключить с помощью командной строки варианты это предоставляет)
    • Папка / создание заметки / кнопка загрузки
  • Обслуживание правильных MIME для файлов известных типов (с возможностью отключения)
  • Возможность установки в виде пакета npm и локального инструмента или однолинейной установки в качестве постоянного сервиса с Docker
  • Служба файлов HTTP 206 (многокомпонентная передача файлов) для более быстрой передачи
  • Загрузка с терминала и консоли браузера (фактически она изначально предназначалась в качестве посредника файловой системы для консоли обозревателя JS на других страницах / доменах)
  • Загрузка / выгрузка CORS (которую также можно отключить)
  • Простая интеграция HTTPS
  • Облегченные параметры командной строки для достижения более безопасного обслуживания с ним:
    • С моим патчем на node.js 8 вы можете получить доступ к параметрам без предварительной установки:curl pad.js.org | node - -h
    • Или сначала установите его как системный глобальный пакет npm, [sudo] npm install -g pad.jsа затем используйте его установленную версию, чтобы получить доступ к его параметрам:pad -h
    • Или используйте предоставленный образ Docker, который использует относительно безопасные параметры по умолчанию. [sudo] docker run --restart=always -v /files:/files --name pad.js -d -p 9090:9090 quay.io/ebraminio/pad.js

Скриншот индекса папки с помощью инструмента

Описанные выше функции в основном документированы на главной странице инструмента http://pad.js.org, который с помощью некоторого приятного трюка, который я использовал, также служит источником для самого источника инструмента!

Источник инструмента находится на GitHub, который приветствует ваши отзывы, пожелания и пожелания!


5

С npm@5.2.0 npmначал устанавливать новый бинарный файл вместе с обычным npm npx. Итак, теперь один лайнер для создания статического http-сервера из текущего каталога:

npx serve

или

npx http-server

4

Для здорового повышения производительности при использовании узла для обслуживания статических ресурсов я рекомендую использовать Buffet . Он работает так же, как ускоритель веб-приложений, также известный как кеширующий обратный прокси-сервер HTTP, но он просто загружает выбранный каталог в память.

Buffet использует полностью буферизованный подход - все файлы полностью загружаются в память при загрузке приложения, поэтому вы никогда не почувствуете ожог файловой системы. На практике это очень эффективно. Настолько, что размещение Varnish перед вашим приложением может даже сделать его медленнее! 

Мы используем его на сайте codePile и обнаружили увеличение на ~ 700 запросов / сек до> 4 тыс. Запросов / сек на странице, которая загружает 25 ресурсов при нагрузке на одновременное соединение пользователей 1 КБ.

Пример:

var server = require('http').createServer();

var buffet = require('buffet')(root: './file'); 

 

server.on('request', function (req, res) {

  buffet(req, res, function () {

    buffet.notFound(req, res);

  });

});

 

server.listen(3000, function () {

  console.log('test server running on port 3000');

});


4

Ниже работало для меня:

Создайте файл app.jsс содержанием ниже:

// app.js

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

http.createServer(function (req, res) {
  fs.readFile(__dirname + req.url, function (err,data) {
    if (err) {
      res.writeHead(404);
      res.end(JSON.stringify(err));
      return;
    }
    res.writeHead(200);
    res.end(data);
  });
}).listen(8080);

Создайте файл index.htmlс содержанием ниже:

Hi

Запустите командную строку:

cmd

Запустите ниже в cmd:

node app.js

Перейти ниже URL, в Chrome:

http://localhost:8080/index.html

Это все. Надеюсь, это поможет.

Источник: https://nodejs.org/en/knowledge/HTTP/servers/how-to-serve-static-files/


3

Вы можете попробовать служить мне

Используя это так просто:

ServeMe = require('serve-me')();
ServeMe.start(3000);

Это все.

PD: папка, обслуживаемая по умолчанию, является «общедоступной».


3

Вот еще один простой веб-сервер.

https://www.npmjs.com/package/hostr

устанавливать

npm install -g hostr

Смена рабочего директора

cd myprojectfolder/

И начать

hostr

Это также отслеживает изменения и обеспечивает перезагрузку в реальном времени.
Qwerty

3

В простом node.js:

const http = require('http')
const fs = require('fs')
const path = require('path')

process.on('uncaughtException', err => console.error('uncaughtException', err))
process.on('unhandledRejection', err => console.error('unhandledRejection', err))

const publicFolder = process.argv.length > 2 ? process.argv[2] : '.'
const port = process.argv.length > 3 ? process.argv[3] : 8080

const mediaTypes = {
  zip: 'application/zip',
  jpg: 'image/jpeg',
  html: 'text/html',
  /* add more media types */
}

const server = http.createServer(function(request, response) {
  console.log(request.method + ' ' + request.url)

  const filepath = path.join(publicFolder, request.url)
  fs.readFile(filepath, function(err, data) {
    if (err) {
      response.statusCode = 404
      return response.end('File not found or you made an invalid request.')
    }

    let mediaType = 'text/html'
    const ext = path.extname(filepath)
    if (ext.length > 0 && mediaTypes.hasOwnProperty(ext.slice(1))) {
      mediaType = mediaTypes[ext.slice(1)]
    }

    response.setHeader('Content-Type', mediaType)
    response.end(data)
  })
})

server.on('clientError', function onClientError(err, socket) {
  console.log('clientError', err)
  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n')
})

server.listen(port, '127.0.0.1', function() {
  console.log('👨‍🔧 Development server is online.')
})

Это простой сервер node.js, который обслуживает только запрошенные файлы в определенном каталоге.

Применение:

node server.js folder port

folderможет быть абсолютным или относительным в зависимости от server.jsместоположения. Значением по умолчанию является .каталог, в котором вы выполняете node server.jsкоманду.

port по умолчанию 8080, но вы можете указать любой порт, доступный в вашей ОС.

В вашем случае я бы сделал:

cd D:\Folder
node server.js

Вы можете просматривать файлы D:\Folderв браузере, набравhttp://127.0.0.1:8080/somefolder/somefile.html


2

Пока что это не для NPM, но я построил простой статический сервер в Express, который также позволяет вам принимать отправленные формы и отправлять их по электронной почте через транзакционную почтовую службу (пока что Sendgrid, ожидается Mandrill).

https://github.com/jdr0dn3y/nodejs-StatServe


2

Для блага поисковиков мне понравился ответ Якуба, но хотелось немного исправить ошибку. Очевидно , что лучше обрабатывать ошибки должным образом , но это должно помочь предотвратить сайт остановки в случае возникновения ошибки. Код ниже:

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

process.on('uncaughtException', function(err) {
  console.log(err);
});

var server = express();

server.use(express.static(__dirname));

var port = 10001;
server.listen(port, function() { 
    console.log('listening on port ' + port);     
    //var err = new Error('This error won't break the application...')
    //throw err
});

Обновление - мой ответ работает, но теперь я использую ответ @Matt Self на использование http-сервера. Вроде хорошо работает.
HockeyJ

2

Сначала установите node-static server с помощью npm install node-static -g -g, чтобы установить его глобально в вашей системе, затем перейдите в каталог, в котором находятся ваши файлы, запустите сервер, static прослушивающий порт 8080, naviaget для браузера и введите localhost: 8080 / yourhtmlfilename ,


2

Для этого вы можете использовать пакет обслуживания NPM , если вам не нужны NodeJS, это быстрый и простой в использовании инструмент:

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

npm install -g serve

2 - Служите вашей статической папке с помощью serve <path>:

d:> serve d:\StaticSite

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

http://localhost:3000

Вы понимаете, что npmэто менеджер пакетов узлов, так что вы на самом деле используете NodeJS
derickito

Я делаю, то, что я имел в виду как «материал NodeJS», использовал NodeJS и экспресс для обслуживания файлов, как и предлагалось в большинстве ответов. Serve - это независимый исполняемый файл, NPM используется только для его установки, вы можете просто загрузить его напрямую.
Диего Мендес

1

Поиск в реестре NPM https://npmjs.org/search?q=server , я нашел статический сервер https://github.com/maelstrom/static-server

Вам когда-нибудь нужно было отправлять коллеге файл, но не могли бы вы позаботиться о том, чтобы отправить 100-мегабайтное чудовище по электронной почте? Хотел запустить простой пример приложения JavaScript, но были проблемы с запуском его через протокол file: ///? Хотите поделиться своим мультимедийным каталогом в локальной сети без настройки Samba, FTP или чего-либо еще, требующего редактирования файлов конфигурации? Тогда этот файловый сервер сделает вашу жизнь немного проще.

Чтобы установить простой статический сервер, используйте npm:

npm install -g static-server

Затем, чтобы обслуживать файл или каталог, просто запустите

$ serve path/to/stuff
Serving path/to/stuff on port 8001

Это может даже перечислить содержимое папки.

К сожалению, он не мог обслуживать файлы :)


5
Я построил этот сервер. Этот файловый сервер был построен на очень старой версии Node, поэтому он больше не работает. У меня нет времени, чтобы исправить это. Я предлагаю использовать ответ @Oleg выше. Его можно легко связать в исполняемый файл небольшого узла, и это, по сути, то, что я сделал в любом случае.
Тим Хип

Спасибо, Тим, очень профессиональный ответ. Я бы не стал удалять код, но обновлял readme.
Пол Верест



1

const http = require('http');
const fs = require('fs');
const url = require('url');
const path = require('path');


let mimeTypes = {
  '.html': 'text/html',
  '.css': 'text/css',
  '.js': 'text/javascript',
  '.jpg': 'image/jpeg',
  '.png': 'image/png',
  '.ico': 'image/x-icon',
  '.svg': 'image/svg+xml',
  '.eot': 'appliaction/vnd.ms-fontobject',
  '.ttf': 'aplication/font-sfnt'
};



http.createServer(function (request, response) {
  let pathName = url.parse(request.url).path;
  if(pathName === '/'){
    pathName = '/index.html';
  }
  pathName = pathName.substring(1, pathName.length);
  let extName = path.extName(pathName);
  let staticFiles = `${__dirname}/template/${pathName}`;

      if(extName =='.jpg' || extName == '.png' || extName == '.ico' || extName == '.eot' || extName == '.ttf' || extName == '.svg')
      {
          let file = fr.readFileSync(staticFiles);
          res.writeHead(200, {'Content-Type': mimeTypes[extname]});
          res.write(file, 'binary');
          res.end();
      }else {
        fs.readFile(staticFiles, 'utf8', function (err, data) {
          if(!err){
            res.writeHead(200, {'Content-Type': mimeTypes[extname]});
            res.end(data);
          }else {
            res.writeHead(404, {'Content-Type': 'text/html;charset=utf8'});
            res.write(`<strong>${staticFiles}</strong>File is not found.`);
          }
          res.end();
        });
      }
}).listen(8081);


Вы должны добавить объяснение alog с этим кодом.
Абхинав Гауниял

1

Если вы заинтересованы в сверхлегком http-сервере без каких-либо предварительных условий, вам стоит взглянуть на: mongoose



0

Вы также спросили, почему запросы сбрасываются - не знаете, в чем конкретная причина для вашего случая, но в целом вы улучшаете статическое содержимое сервера с помощью специального промежуточного программного обеспечения (nginx, S3, CDN), потому что Node действительно не оптимизирован для этого сетевого шаблона. Смотрите дальнейшее объяснение здесь (пункт 13): http://goldbergyoni.com/checklist-best-practice-of-node-js-in-production/

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.