K
K
KnightForce2017-04-02 21:10:59
Node.js
KnightForce, 2017-04-02 21:10:59

How to serve static in Node.js without Express.js?

How to serve static in Node.js without Express.js?

Answer the question

In order to leave comments, you need to log in

3 answer(s)
H
hufawoso, 2017-04-02
@hufawoso

Something like this:

// Встроенный модуль 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);
            }
        });
    }
}

N
Negwereth, 2017-04-02
@Negwereth

http-server

K
Konstantin Kitmanov, 2017-04-03
@k12th

In general, this is not very efficient. Once, in my youth, I was too lazy to set up nginx to distribute statics and gave it away as a node, and not with a self-written crutch, but with a package made by respected people. Proc and memory were occupied by about 30%, after switching to nginx it became 10% each.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question