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

Есть ли готовый к использованию 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 удаляет запросы? ссылайтесь на некоторые мистические

стандартный Node.js статический файловый сервер

Если нет такого инструмента, какую структуру я должен использовать?

по теме: Основной статический файловый сервер в NodeJS

Ответ 1

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

npm install http-server -g

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

cd D:\Folder
http-server

Или, например:

http-server D:\Folder

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

Ответ 2

Если вы не хотите использовать готовый инструмент, вы можете использовать приведенный ниже код, как показано мной в 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/');

UPDATE Если вам нужно получить доступ к вашему серверу из внешнего спроса/файла, вам необходимо преодолеть 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);

UPDATE

Как отметил Адриан, в комментариях он написал код 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}`);

Ответ 3

Для людей, желающих запустить сервер из NodeJS script:

Вы можете использовать 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

Ответ 4

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

python -m SimpleHTTPServer [port]

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

Ответ 5

connect может быть тем, что вы ищете.

Легко устанавливается с помощью:

npm install connect

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

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

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

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

Ответ 6

Установить экспресс с помощью 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 с консоли с помощью этой команды:

node server.js

Просмотр на localhost: 8080

Ответ 7

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

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

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 "

Ответ 8

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

enter image description here

Первый - это 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-server --help
usage: http-server [path] [options]

options:
  -p           Port to use [8080]
  -a           Address to use [0.0.0.0]
  -d           Show directory listings [true]
  -i           Display autoIndex [true]
  -g --gzip    Serve gzip files when possible [false]
  -e --ext     Default file extension if none supplied [none]
  -s --silent  Suppress log messages from output
  --cors[=headers]   Enable CORS via the "Access-Control-Allow-Origin" header
                     Optionally provide CORS headers list separated by commas
  -o [path]    Open browser window after starting the server
  -c           Cache time (max-age) in seconds [3600], e.g. -c10 for 10 seconds.
               To disable caching, use -c-1.
  -U --utc     Use UTC time format in log messages.

  -P --proxy   Fallback proxy if the request cannot be resolved. e.g.: http://someurl.com

  -S --ssl     Enable https.
  -C --cert    Path to ssl cert file (default: cert.pem).
  -K --key     Path to ssl key file (default: key.pem).

  -r --robots  Respond to /robots.txt [User-agent: *\nDisallow: /]
  -h --help    Print this list and exit.
C:\Users\Qwerty>serve --help

  Usage: serve.js [options] [command]

  Commands:

    help  Display help

  Options:

    -a, --auth      Serve behind basic auth
    -c, --cache     Time in milliseconds for caching files in the browser
    -n, --clipless  Don't copy address to clipboard (disabled by default)
    -C, --cors      Setup * CORS headers to allow requests from any origin (disabled by default)
    -h, --help      Output usage information
    -i, --ignore    Files and directories to ignore
    -o, --open      Open local address in browser (disabled by default)
    -p, --port   Port to listen on (defaults to 5000)
    -S, --silent    Don't log anything to the console
    -s, --single    Serve single page applications (sets '-c' to 1 day)
    -t, --treeless  Don't display statics tree (disabled by default)
    -u, --unzipped  Disable GZIP compression
    -v, --version   Output the version number

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

Ответ 9

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

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

npm install -g browser-sync

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

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

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

Подробнее можно узнать из BrowserSync

Спасибо.

Ответ 10

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

Добавьте файл 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 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"
  }

Ответ 11

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

Для настройки простого приложения для работы с файлами выполните следующее:

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

Ответ 12

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

curl pad.js.org | node 

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

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

  • Создание и обслуживание индекса иерархического каталога
    • С возможностью сортировки по различным критериям
    • Загрузка из браузера с помощью [multi-file] drag-and -d rop и копирование-вставка из файла/текста и вставка снимка экрана из системного буфера обмена в Chrome, Firefox и других браузерах может с некоторыми ограничениями (которые могут быть отключены с помощью параметры командной строки это обеспечивает)
    • Папка/создание заметки/кнопка загрузки
  • Обслуживание правильных MIME для файлов известных типов (с возможностью отключения)
  • Возможность установки в виде пакета npm и локального инструмента или однолинейной установки в качестве постоянного сервиса с Docker
  • Служба файлов HTTP 206 (многокомпонентная передача файлов) для более быстрой передачи
  • Загрузка с терминала и консоли браузера (фактически она изначально предназначалась для использования в качестве посредника файловой системы для консоли браузера JS на других страницах/доменах)
  • Загрузка/выгрузка CORS (которую также можно отключить)
  • Простая интеграция HTTPS
  • Облегченные параметры командной строки для достижения более безопасного обслуживания с ним:
    • С моим патчем на node.js 8 вы можете получить доступ к опциям без предварительной установки: curl pad.js.org | node - -h curl pad.js.org | node - -h
    • Или сначала установите его как системный пакет -g lobal 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

Screenshot of a folder index using the tool

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

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

Ответ 13

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

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

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

Пример:

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

});

Ответ 14

Посмотрите, что ссылка .

Вам нужно только установить экспресс-модуль node js.

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

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

Вы можете получить доступ к своему файлу, например http://hostname/Folder/file.zip

Ответ 15

Вы можете попробовать serve-me

Использование его настолько просто:

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

Вот и все.

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

Ответ 16

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

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

Установить

npm install -g hostr

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

cd myprojectfolder/

И запустите

hostr

Ответ 17

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

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

Ответ 18

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

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

Ответ 19

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

Ответ 20

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

Ответ 21

Поиск в реестре NPM https://npmjs.org/search?q=server, я нашел static-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

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

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

Ответ 24

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

Ответ 25

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

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

npm install -g serve

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

d:> serve d:\StaticSite

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

http://localhost:3000

Ответ 26

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

Создайте файл 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/

Ответ 27

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

https://github.com/alejandro/Houston

Ответ 28

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

Ответ 29

Для тех, кто хочет простое решение для пользовательского интерфейса, я написал это приложение https://github.com/iarickvigasi/NUIS

Ответ 30

небольшой веб-сервер командной строки на Node.js: miptleha-http

полный исходный код code (80 строк)