Node.JS [ru] | Серверный JavaScript
11.5K subscribers
91 photos
6 videos
25 files
3.16K links
Все о разработке backend части на JavaScript (Node JS).
А так же: Express JS, Next JS, Nest, Socket.IO

Канал на бирже - https://telega.in/c/we_use_js

По вопросам рекламы или разработки: @g_abashkin

РКН: https://vk.cc/cJPGOP
Download Telegram
👩‍💻 HTTP-ответ с таймером самоуничтожения

Реализуйте простой 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, `https://${
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 https://localhost:${PORT}`);
});
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4😁21
👩‍💻 В чём разница между exports и module.exports

Вы знаете в чём разница между exports и module.exports в Node.js? Для начала рассмотрим, что представляет собой объект модуля.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32
👩‍💻 Якорные ссылки и как их сделать потрясающими

Якорные ссылки — простой способ создать навигацию по странице. Например, в оглавлении можно использовать якорные ссылки для перехода к различным разделам страницы.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32
👩‍💻 Корутины: stackful vs stackless

В статье разберемся, что такое stackless и stackful корутины, их основные отличия, плюсы и минусы. Я объясню это простым языком, чтобы даже сложные концепции многопоточности были легко понятны.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
🖥 Использование ChatGPT для автоматизации генерации кода в JS-проекте

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

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
🔍 Не «улучшай» код, который не используешь

Кажется, что старый кусок можно сделать красивее и лаконичнее? Но ты даже не уверен, что он ещё актуален.

👉 Совет: сначала проверь, используется ли вообще этот код. Удали мёртвый — это лучше, чем его улучшить. Поддерживать неиспользуемую логику — всё равно что чистить пустой склад каждый день.
Please open Telegram to view this post
VIEW IN TELEGRAM
2👎2👍1
⚙️ Паттерн «Бэкенд для фронтенда»: преимущества, недостатки и лучшие практики для реализации

Если ты хочешь стать настоящим мастером API, тебе нужно знать о паттерне BFF. В этой статье рассказываем, как создавать управляемую архитектуру с использованием BFF, избегая избыточной сложности и головной боли при поддержке.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Задачка по NodeJS

Создайте приложение на Node.js, которое принимает URL в качестве аргумента командной строки, загружает HTML-контент по указанному URL, подсчитывает количество тегов на странице и сохраняет результат в tags.json.

➡️ Пример:

node app.js report https://example.com — сохраняет количество тегов HTML-страницы в файл tags.json.
node app.js print https://example.com — выводит статистику по тегам на странице в консоль.

Решение задачи ⬇️

const https = require('https');
const fs = require('fs');
const { JSDOM } = require('jsdom');

const action = process.argv[2];
const url = process.argv[3];

function fetchHtml(url) {
return new Promise((resolve, reject) => {
https.get(url, (res) => {
let data = '';
res.on('data', (chunk) => (data += chunk));
res.on('end', () => resolve(data));
}).on('error', (err) => reject(err));
});
}

async function report(url) {
try {
const html = await fetchHtml(url);
const dom = new JSDOM(html);
const tags = Array.from(dom.window.document.getElementsByTagName('*')).map(el => el.tagName);
const tagCount = tags.reduce((acc, tag) => {
acc[tag] = (acc[tag] || 0) + 1;
return acc;
}, {});

fs.writeFileSync('tags.json', JSON.stringify(tagCount, null, 2));
console.log('Статистика сохранена в tags.json');
} catch (err) {
console.error('Ошибка:', err);
}
}

async function print(url) {
try {
const html = await fetchHtml(url);
const dom = new JSDOM(html);
const tags = Array.from(dom.window.document.getElementsByTagName('*')).map(el => el.tagName);
const tagCount = tags.reduce((acc, tag) => {
acc[tag] = (acc[tag] || 0) + 1;
return acc;
}, {});

console.log('Статистика по тегам:', tagCount);
} catch (err) {
console.error('Ошибка:', err);
}
}

if (action === 'report') {
report(url);
} else if (action === 'print') {
print(url);
} else {
console.log('Используйте команды: report <URL> или print <URL>');
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
👩‍💻 Как деструктуризация массивов может замедлить JavaScript код

В статье объясняется, как деструктуризация массивов может замедлить JavaScript код. Рассматриваются различия в байткоде и проводится тест, показывающий, почему ArrayAssignmentPattern не всегда оптимален.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
👩‍💻 Как я искал рекомендации аналитиков по покупке российских ценных бумаг в JSON формате

В статье рассказывается о создании системы для поиска недооценённых акций на российском рынке, используя данные аналитиков. Рассматривается, как собирать прогнозы для 89 акций с Московской биржи и анализировать их точность.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Как ускорить создание компонентов с помощью Plop-генератора или автоматизация рутинных задач в React

В статье рассказывается о крупной фронтенд-команде, которая работает с микросервисами и общей дизайн-системой. Несмотря на стандарты, возникали проблемы, и статья подробно раскрывает, как они были решены.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Как работает система событий и EventEmitter в Node.js?

В Node.js события обрабатываются с помощью объекта EventEmitter. Этот объект позволяет объявлять события и реагировать на них с помощью подписок. Когда событие происходит, вызываются все функции, подписанные на него. Это важный механизм для асинхронной архитектуры.

➡️ Пример:

const EventEmitter = require('events');
const emitter = new EventEmitter();

emitter.on('event', () => {
console.log('Событие произошло!');
});

emitter.emit('event'); // "Событие произошло!"


🗣️ EventEmitter широко используется в Node.js для асинхронной обработки и реакции на различные события в системе.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
👩‍💻 Введение в AI Selfie Background Remover с использованием TensorFlow.js для React-приложений

В статье рассматривается "React Selfie AI Background Remover" — компонент, использующий TensorFlow.js для удаления фона в браузере. Основные фишки: точная сегментация с MediaPipe, легкая интеграция в React и live demo.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Как я создавал онлайн игру «нарды». Сервер

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

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
👩‍💻 Освоение безопасной для типов JSON-сериализации в TypeScript

Предлагаем руководство по использованию TypeScript для безопасной для типов сериализации и десериализации данных в формате JSON. Освоение этой стратегии позволит своевременно обнаруживать потенциальные ошибки во время разработки приложения.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
👩‍💻 База, которую нужно знать про JSON Schema

Сегодня мы рассмотрим одну из тем, которая, как ни странно, остаётся недооценённой — JSON Schema. Если ты аналитик (или хочешь им быть) и в твоей работе часто мелькают JSON-файлы, то наверняка знаешь, как сложно порой бывает держать всё это под контролем. В этой статье мы разберём всё, что тебе нужно знать про JSON Schema.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
👩‍💻 Как эффективно управлять ошибками в серверных приложениях Node.js?

В серверных приложениях на Node.js правильное управление ошибками является критически важным для обеспечения стабильности и безопасности. Ошибки могут возникать в асинхронных операциях, таких как работа с базами данных или сторонними API.

➡️ Node.js предоставляет несколько механизмов для управления ошибками: от обработки исключений в промисах до централизованной обработки с помощью middleware в Express.

const express = require('express');
const app = express();

app.get('/', async (req, res, next) => {
try {
const result = await someAsyncOperation();
res.send(result);
} catch (err) {
next(err);
}
});

app.use((err, req, res, next) => {
console.error('Ошибка:', err.message);
res.status(500).send('Ошибка сервера');
});

app.listen(3000, () => {
console.log('Сервер запущен');
});


🗣️ В серверных приложениях важно использовать глобальные обработчики ошибок и middleware, чтобы не допустить краха сервера при возникновении исключений в асинхронных запросах.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
👩‍💻 Твой JavaScript должен быть проще: 10 приемов современного разработчика

Советы по написанию короткого, лаконичного и чистого кода на JavaScript

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8👎1🐳1