Під час одного з питань, до нас звернувся інженер з запитанням про обробку скасування запиту в середовищі Node.js. Хоча я не можу точно пригадати, яку саме відповідь подав Тимур, можливо, він згадав про AbortController, який на той час ще не був широко відомий і ще обговорювався в рамках TC39. Однак, я пам'ятаю свою власну відповідь, яка була короткою і некоректною – "кулі з фронту вже вилетіли, тобто їх не скасувати".
Зараз вже минуло 4 роки з того часу. В даний момент я займаюся консультуванням одного мобільного проекту. За останні півроку ми значно знизили кількість помилок як на стороні клієнта, так і на стороні сервера. Проте, у зв'язку з цим зросла частка помилок, які залишаються невідомими або непередбачуваними, з 0.01% до 2%. Цього тижня мені довелося зіткнутися з дивним явищем. Виявилося, що фреймворк Nest.js не генерує помилку, коли сокет вже закритий. Це стосується також інших фреймворків, таких як Express.js, Fastify або навіть простий Node.js, бо саме Node.js не генерує винятків, коли клієнт відключається до отримання відповіді від сервера.
З одного боку не можна писати відповідь у закритий сокет без помилок, але... Бажаєте перевірити? Натисніть cancel у Postman:
const { scheduler } = require('node:timers/promises');const express = require('express')const app = express()app.get('/', async function (req, res) { await scheduler.wait(60_000) res.send('hello world')})app.listen(3000)Щобі ви розуміли рівень мого когнетивного дисонансу, у мене відчуття, що все що я знав до цього про розробку немає сенсу. Тому що Go/Python/PHP/etc поводяться так само. Але їх я ще перевіряю, бо Node.js я вже перевірив тричі.