Швидкий файловий сервер 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
Jon

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

Відповіді:


1090

Хорошим варіантом "готового до використання інструменту" може бути 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
Варто також перевірити синхронізацію браузера , що може зробити те ж саме, але з додатковим бонусом живого оновлення при зміні файлів.
Нік F

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

9
npx http-server- npx перетворює його в однолінійку, яка завантажує необхідні файли і запускає її.
Майк Маккей

185

Якщо ви не хочете використовувати готовий інструмент, ви можете скористатися наведеним нижче кодом, як це продемонструвало на 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
Adrian

1
@Adrian Цей код дуже приголомшливий, але я знайшов спосіб отримати кореневий доступ до нього. Рішення полягає в тому, щоб обмежити кількість провідних періодів у імені файлу до одного, щоб ви не могли робити ../../etc/passwordщось. gist.github.com/amejiarosario/53afae82e18db30dadc9bc39035778e5
Seph Reed

1
pathname = pathname.replace(/^(\.)+/, '.');
Seph Reed

79

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

Ви можете використовувати expressjs / serve-static, який замінює connect.static(який більше не доступний підключення 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
FYI Це для мене не вийшло. Я встановив файл-обробник за допомогою, npm install filehandlerі пакет вказаний в node_modulesкаталозі. Але коли я запускаю, myapp.jsвузол видає помилку, кажучи Error: cannot find module filehandler. Якщо я коментую вимогу ststment для завантаження файлообробника, додаток завантажує сервісну статику просто чудово, тому схоже, що з пакетом filhandler щось не так. Сьогодні 12 грудня 2014 року, тож, можливо, пакет змінився з моменту опублікування цієї відповіді?
Лі Дженкінс

7
Це finalобробник неfile
jakub.g

Ще одна перевага цього рішення полягає в тому, що файли не кешуються, тому вам не потрібно перезапускати процес під час внесення змін у код.
klimat

59

Я знаю, що це не Node, але я використав SimpleHTTPServer Python:

python -m SimpleHTTPServer [port]

Він добре працює і постачається з Python.


16
Еквівалент Python3: python -m http.server [port](згаданий для Python2)
jakub.g

Python не працює для мене, коли мова йде про подачу великих файлів, таких як зображення ОС. Fedora 23
Зімі

9
А на PHP:php -S localhost:8000
dennis

Я використовую це для швидкого обслуговування вмісту з папки весь час.
Адріан Лінч

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
Це більше не працює з підключення 3, оскільки воно не відкривається connect.static; дивіться мою відповідь нижче щодо заміни
jakub.g

4
Я вважаю, що він як і раніше в комплекті з експресом за замовчуванням, але насправді існує зараз в окремому requireмодулі "serve-статичний".
Олег

18

Встановити експрес за допомогою npm: https://expressjs.com/en/starter/installing.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
@Wei Привіт, пізня відповідь. З того, що я бачу при швидкому пошуку в Google, схоже, що структура вашого каталогу може бути неправильною. У місці, на яке ви орієнтовані, має бути файл index.html. Налаштування наведеного вище прикладу має зайняти 5 хвилин, і я двічі перевірив, чи працює він як є. Звідти ви можете налаштувати шлях відповідно до структури вашої директорії та перевірити, чи сервер все ще знаходить файли, які йому потрібні.
pasx

path.join(__dirname, 'public')є більше кросплатформенним.
sdgfsdh

16

Однорядкові докази ™ замість обіцянок

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

Під - перше 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: \ Користувачі \ Qwerty> http-сервер --help
використання: http-сервер [шлях] [параметри]

варіанти:
  -p порт для використання [8080]
  -а адреса для використання [0.0.0.0]
  -d Показати списки каталогів [true]
  -i Показати autoIndex [true]
  -g --gzip Подавайте файли gzip, коли це можливо [false]
  -e - наступне розширення файлу за замовчуванням, якщо таке не надано [немає]
  -s --silent Придушити повідомлення журналу з виводу
  --cors [= заголовки] Увімкніть CORS за допомогою заголовка "Access-Control-Allow-Origin"
                     За бажанням надайте список заголовків CORS, розділених комами
  -o [шлях] Відкрийте вікно браузера після запуску сервера
  -c Час кешу (максимальний вік) в секундах [3600], наприклад -c10 протягом 10 секунд.
               Щоб відключити кешування, використовуйте -c-1.
  -U --utc Використовуйте формат часу UTC у повідомленнях журналу.

  -P - proxy Fallback proxy, якщо запит неможливо вирішити. наприклад: http://someurl.com

  -S --ssl Увімкнути https.
  -C - початковий шлях Шлях до ssl-файлу cert (за замовчуванням: cert.pem).
  -K - ключ клавіші Шлях до ssl (за замовчуванням: key.pem).

  -r --robots Відповісти на /robots.txt [User-agent: * \ nЗаборонити: /]
  -h --help Роздрукуйте цей список і вийдіть.
C: \ Користувачі \ Qwerty> serve - допомогти

  Використання: serve.js [параметри] [команда]

  Команди:

    допомога Показати довідку

  Параметри:

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

Якщо вам потрібно спостерігати за змінами, дивіться hostr, почитайте відповідь Генрі Ценга


14

DEMO / PROTO SERVER ТІЛЬКИ

Якщо це все, що вам потрібно, спробуйте це:

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 створить трубу, щоб вийти з readStream.
Едуард Бондаренко

1
Найкраща відповідь, якщо вам потрібен швидкий і брудний одноразовий поні.
колапс

1
Якщо ви не хочете використовувати його index.htmlяк частину своєї адреси, просто додайте if (req.url === '/') req.url = '/index.html';відразу res.writeHead(200);.
Джозеф Чо

3
@EduardBondarenko має рацію. 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прапором, змінюються (nb. Вам не потрібно вказувати ./*- лише ті, для яких 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; їх $ express?
Пол Верест

Я дотримувався ваших кроків, але в моїй експресі немає папки біна
Qwerty

6

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

curl pad.js.org | node 

(у документації існують різні команди для користувачів Windows)

Він підтримує різні речі, які, на мою думку, можуть бути корисними,

  • Створення / обслуговування індексу ієрархічного каталогу
    • З можливістю сортування за різними критеріями
    • Завантаження із браузера через [багатофайл] перетягування та перетягування файлів / текстових копій-вставлення та системного буфера обміну екраном в папку 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, яке вітає ваші відгуки, запити щодо функцій та !s!


5

Починаючи з npm@5.2.0, npmпочав встановлювати новий двійковий файл поряд зі звичним npm, що називається npx. Отже, один лайнер для створення статичного http-сервера з поточного каталогу:

npx serve

або

npx http-server

4

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

Buffet використовує повністю буферний підхід - усі файли повністю завантажуються в пам'ять, коли додаток завантажується, тому ви ніколи не відчуєте опіку файлової системи. На практиці це надзвичайно ефективно. Настільки, що розміщення лаку перед вашим додатком може навіть зробити це повільніше! 

Ми використовуємо його на сайті codePile і виявили збільшення на ~ 700 запитів / сек до> 4k запитів / сек на сторінці, яка завантажує 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-адресою в хромі:

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

Це все.

ПД: Папка, яка обслуговується за замовчуванням, є "загальнодоступною".


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-сервера. Здається, працює добре.
ХокейJ

2

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


2

Для цього ви можете використовувати пакет обслуговування NPM , якщо вам не потрібні речі NodeJS, це швидкий і простий у використанні інструмент:

1 - Встановіть пакет на свій ПК:

npm install -g serve

2 - Обслуговуйте свою статичну папку за допомогою serve <path>:

d:> serve d:\StaticSite

Він покаже вам, в якому порту подається ваша статична папка, просто перейдіть до хоста, як-от:

http://localhost:3000

Ви розумієте, що npmце менеджер пакетів вузлів, тому ви фактично використовуєте речі
NodeJS

Я маю на увазі те, що я мав на увазі як "NodeJS речі", використовував NodeJS і виражав, щоб обслуговувати файли, як більшість запропонованих відповідей. Serve - це незалежний виконуваний файл, NPM використовується просто для його встановлення, ви можете просто завантажити його безпосередньо.
Дієго Мендес

1

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

Коли-небудь потрібно було надіслати колезі файл, але не можна заважати надсилати електронну пошту звіру на 100 Мб? Хотіли запустити простий приклад JavaScript, але мали проблеми з його запуском через файл: /// протокол? Хочете поділитися своїм медіа-каталогом у локальній мережі, не налаштовуючи 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);


Ви повинні додати деякі пояснення з цим кодом.
Абхінав Гауніял



0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.