Answer the question
In order to leave comments, you need to log in
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
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);
}
});
}
}
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 questionAsk a Question
731 491 924 answers to any question