@KnightForce

Как в Node.js отдавать статику без Express.js?

Как в Node.js отдавать статику без Express.js?
  • Вопрос задан
  • 1754 просмотра
Пригласить эксперта
Ответы на вопрос 3
@hufawoso
Как-то так:
// Встроенный модуль http поддерживает функциональность HTTP-сервера и HTTP-клиента
var http = require('http');
// Встроенный модуль fs поддерживает функциональность файловой системы
var fs = require('fs');
// Встроенный модуль path поддерживает функциональность, связанную с путями файловой системы
var path = require('path');
// Дополнительный модуль mime поддерживает порождение MIME-типов на основе расширения имен файлов
var mime = require('mime');
// Объект cache реализует хранение содержимого кэшированных файлов
var cache = {};

var server = http.createServer(function(request, response) {
    var filePath = false;
    if (request.url == '/') {
// Определение HTML-файла, обслуживаемого по умолчанию
        filePath = 'public/index.html';
    } else {
// Преобразование URL-адреса в относительный путь к файлу
        filePath = 'public' + request.url;
    }
    var absPath = './' + filePath;
// Обслуживание статического файла
    serveStatic(response, cache, absPath);
});

server.listen(3000, function() {
    console.log("Server listening on port 3000.");
});


function send404(response) {
    response.writeHead(404, {'Content-Type': 'text/plain'});
    response.write('Error 404: resource not found.');
    response.end();
}

function sendFile(response, filePath, fileContents) {
    response.writeHead(
        200,
        {"content-type": mime.lookup(path.basename(filePath))}
    );
    response.end(fileContents);
}

function serveStatic(response, cache, absPath) {
// Проверка факта кэширования файла в памяти
    if (cache[absPath]) {
// Обслуживание файла, находящегося в памяти
        sendFile(response, absPath, cache[absPath]);
    } else {
// Проверка факта существования файла
        fs.exists(absPath, function(exists) {
            if (exists) {
// Считывание файла с диска
                fs.readFile(absPath, function(err, data) {
                    if (err) {
                        send404(response);
                    } else {
                        cache[absPath] = data;
// Обслуживание файла, считанного с диска
                        sendFile(response, absPath, data);
                    }
                });
            } else {
// Отсылка HTTP-ответа 404
                send404(response);
            }
        });
    }
}
Ответ написан
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Вообще это не очень эффективно. Однажды по молодости поленился настроить nginx на раздачу статики и отдавал ее нодой, причем не самописным костылем, а сделанным уважаемыми людьми пакетом. Проц и память были заняты где-то на 30%, после перехода на nginx стало по 10%.
Ответ написан
Комментировать
Negwereth
@Negwereth
lvivcss.com.ua
http-server
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы