• Без головы — лучше! Разворачиваем собственную Headless CMS Directus в облаке
• Пишем Realtime для Multiple-page application в микросервисной архитектуре
• Как написать Google Calendar на коленке? Обзор FullCallendar
• Как внедрить наблюдаемость в микросервисное приложение с помощью OpenTelemetry, Jaeger и Prometheus
• Поддержка временных зон в фулстек-приложении на основе NestJS и Angular: работа с REST и WebSockets
Please open Telegram to view this post
VIEW IN TELEGRAM
В этой статье проверяю, как справляется новый AI-ассистент Junie от JetBrains с реальной задачей, и случайно оказываюсь в ситуации из рассказа Азимова.
Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
fs.promises
в Node.js и зачем он нужен?Модуль
fs
в Node.js позволяет работать с файловой системой. Начиная с Node 10+, появился fs.promises
, который возвращает Promise
вместо использования колбэков.Это делает код чище и позволяет писать асинхронные операции через
async/await
const fs = require('fs/promises');
async function readFile() {
try {
const data = await fs.readFile('example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error('Ошибка чтения файла:', err);
}
}
readFile();
🗣️ В этом примере файл example.txt читается асинхронно. Ошибки обрабатываются через try/catch, код становится линейным и легко читаемым.
Это современный способ работы с файлами в Node.js без "адских вложенных колбэков".
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Растущее комьюнити Node.js - свидетельство надежности и эффективности этого инструмента. Однако не всем удается извлечь из него максимальную выгоду. Рассмотрим самые распространенные ошибки разработчиков Node.js.
Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
JavaScript CustomEvent расширяют функциональность встроенной системы событий. Проще говоря, они позволяют программистам создавать и обрабатывать события, уникальные для их приложения, и в этой статье мы расскажем о них всё.
Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
При преобразовании между Buffer и String может быть указана кодировка символов. Если кодировка не указана, по умолчанию будет использоваться UTF-8
Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3
Учимся работать с датой и временем в JavaScript: разбираемся с определением и способом создания объекта Data, его методами и форматами вывода.
Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👎2❤1👍1
Разместим на одном порту два приложения React с Nginx и Docker. Настроим Docker, добавим конфигурацию Nginx глобально и файл docker-compose.yml.
Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
Сегодняшняя тема посвящена нелегким взаимоотношениям клиентского приложения и сервера PostgreSQL: как на ровном месте, неудачной архитектурой приложения, можно обеспечить себе хронические проблемы производительности.
Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1
«Это никогда не ломается» — последняя фраза перед катастрофой. Особенно в частях кода, которые трогают редко.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
В этой статье мы погрузимся в мир переменных среды в Node.js, рассмотрим их преимущества, примеры использования и лучшие практики эффективного управления ими.
Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Promise.withResolvers()
Метод
Promise.withResolvers()
повышает гибкость, позволяя удалённо разрешать или отклонять промисы, упрощая и оптимизируя асинхронный код.Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Визуализация данных — важная часть любого проекта, связанного с аналитикой и обработкой данных. Мы рассмотрим 7 библиотек: Plotly, D3.js, Nivo, Latitude, Apache ECharts, Victory и Chart.js.
Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👎2👍1
Реализуйте простой HTTP-сервер на Node.js (без фреймворков), который обрабатывает GET-запросы и возвращает
"Hello, client!"
.Но с одним условием: если IP-адрес клиента делает больше 5 запросов за 10 секунд, сервер должен временно блокировать этот IP на 30 секунд и отвечать ему
"429 Too Many Requests"
.Решение задачи
const http = require('http');
const PORT = 3000;
const requestLog = {}; // { ip: [timestamps] }
const bannedIPs = {}; // { ip: unblockTimestamp }
function cleanupOldRequests(ip) {
const now =Date.now ();
requestLog[ip] = (requestLog[ip] || []).filter(ts => now - ts < 10000);
}
const server = http.createServer((req, res) => {
const ip = req.socket.remoteAddress;
if (bannedIPs[ip] &&Date.now () < bannedIPs[ip]) {
res.writeHead(429, { 'Content-Type': 'text/plain' });
return res.end('429 Too Many Requests');
}
cleanupOldRequests(ip);
requestLog[ip].push(Date.now ());
if (requestLog[ip].length > 5) {
bannedIPs[ip] =Date.now () + 30000; // блок на 30 сек
requestLog[ip] = [];
res.writeHead(429, { 'Content-Type': 'text/plain' });
return res.end('429 Too Many Requests');
}
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello, client!');
});
server.listen(PORT, () => {
console.log(`Server listening on http://localhost:${PORT}`);
});
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
В рамках этой статьи я опишу создание двух NestJS-модулей с различным способом конфигурирования: утилитарный модуль и бизнес-модуль со своей базой данных.
Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
JavaScript модули позволяют организовывать код для повторного использования. Существует два метода экспорта: по умолчанию и именованный. В этой статье разбираем экспорт по умолчанию и причины, почему его стоит избегать.
Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
В каждом языке программирования есть циклы. Циклы выполняют операцию (т. е. часть работы) несколько раз, обычно по одному разу для каждого элемента массива или списка, или просто повторяют операцию до тех пор, пока не будет выполнено определённое условие.
Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Реализуйте простой HTTP-сервер на Node.js, который возвращает уникальные одноразовые ссылки (вида
/once/abc123
) и сам удаляет их после одного использования или по истечении 60 секунд — в зависимости от того, что наступит раньше.При повторном доступе к использованной или истекшей ссылке сервер должен возвращать
410 Gone
.Поведение:
GET-запрос на /create создаёт новую одноразовую ссылку, возвращает её клиенту.
При первом запросе к этой ссылке (/once/<id>) возвращается "✅ Valid link" и она становится недействительной.
Если никто не обратился к ссылке за 60 секунд — она автоматически удаляется, и возвращается "410 Gone" при попытке перейти.
Решение задачи
const http = require('http');
const crypto = require('crypto');
const PORT = 3000;
const links = {}; // { id: { createdAt: timestamp, used: bool } }
function generateId() {
return crypto.randomBytes(6).toString('hex');
}
function cleanupLinks() {
const now =Date.now ();
for (const id in links) {
if (now - links[id].createdAt > 60000 || links[id].used) {
delete links[id];
}
}
}
setInterval(cleanupLinks, 5000); // чистим каждые 5 сек
const server = http.createServer((req, res) => {
const url = new URL(req.url, `http://${req.headers.host }`);
if (url.pathname === '/create') {
const id = generateId();
links[id] = { createdAt:Date.now (), used: false };
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end(`/once/${id}`);
return;
}
const match = url.pathname.match(/^\/once\/([a-z0-9]+)$/);
if (match) {
const id = match[1];
const record = links[id];
if (!record || record.used || (Date.now () - record.createdAt > 60000)) {
res.writeHead(410, { 'Content-Type': 'text/plain' });
res.end('🔒 410 Gone: Link expired or used');
} else {
links[id].used = true;
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('✅ Valid link');
}
return;
}
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('404 Not Found');
});
server.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}`);
});
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4😁2❤1
Вы знаете в чём разница между exports и module.exports в Node.js? Для начала рассмотрим, что представляет собой объект модуля.
Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2