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
Это может даже перечислить содержимое папки.
К сожалению, он не может обслуживать файлы:)
Ответ 22
Простой статический сервер, использующий connect
var connect = require('connect'),
directory = __dirname,
port = 3000;
connect()
.use(connect.logger('dev'))
.use(connect.static(directory))
.listen(port);
console.log('Listening on port ' + port);
См. также Использование node.js в качестве простого веб-сервера
Ответ 23
Для работы с разработчиками вы можете использовать (выразить 4)
https://github.com/appsmatics/simple-httpserver.git
Ответ 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 строк)