Использование node.js в качестве простого веб-сервера - PullRequest
1041 голосов
/ 22 мая 2011

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

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

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

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

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

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

Ответы [ 30 ]

4 голосов
/ 01 июля 2014

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

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

var app = express();

var oneDay = 86400000;

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

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

console.log("Ready To serve files !")
3 голосов
/ 01 мая 2017

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

npm install lite-server -g

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

lite-server

откроет для вас браузер с живой перезагрузкой.

3 голосов
/ 31 декабря 2016

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

'use strict';

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

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

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

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

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


server.listen(PORT, log.info('Server listening on: ', PORT));
3 голосов
/ 06 марта 2014
var http = require('http');
var fs = require('fs');
var index = fs.readFileSync('index.html');

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

//Just Change The CONTENT TYPE to 'html'
3 голосов
/ 25 октября 2018

из w3schools

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

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

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

http://localhost:8080/file.html

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

2 голосов
/ 11 июля 2015

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

sudo npm install ripple-emulator -g

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

ripple emulate

, затем изменитеустройство на Nexus 7 ландшафт.

1 голос
/ 02 марта 2019

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

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

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

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

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

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

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

var app = express() 
app.use(express.static(folder)) 
app.listen(8181)
console.log("Listening on 8181")
1 голос
/ 30 мая 2017

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

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

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

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

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

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

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

http://127.0.0.1/image.jpg

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

1 голос
/ 08 января 2019

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

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

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

Например:

import {Controller,Response,HttpGet,RequestParam} from "@sugoi/server";
​
@Controller('/dashboard')
export class CoreController{
    constructor(){}
​
    @HttpGet("/:role")
    test(@RequestParam('role') role:string,
         @RequestHeader("role") headerRole:string){
        if(role === headerRole )
            return "authorized";
        else{
            throw new Error("unauthorized")
        }
    }
}
0 голосов
/ 25 июня 2019

local-web-server определенно стоит посмотреть! Вот выдержка из файла readme:

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

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

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

Используйте этот инструмент для:

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

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

Синопсис

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

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

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

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

Учебник по статическим файлам .

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

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

Обслуживание одностраничного приложения (приложение с маршрутизацией на стороне клиента, например, приложение React или Angular) столь же тривиально, как указание имени вашей отдельной страницы:

$ ws --spa index.html

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

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

Учебник SPA .

image

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

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

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

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

Руководство по переписыванию .

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

HTTPS и HTTP2

Для HTTPS или HTTP2 передайте флаги --https или --http2 соответственно. См. Вики для дополнительных параметров конфигурации и руководства о том, как получить "зеленый замок" в вашем браузере.

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