From 6a81ad9983aa8f371bbe839eee6005d789b0c7e9 Mon Sep 17 00:00:00 2001 From: shats Date: Wed, 27 Aug 2025 17:50:42 +0700 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D1=83?= =?UTF-8?q?=20=D0=BB=D0=B8=D0=BC=D0=B8=D1=82=D0=B0=20=D0=B2=20API=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=BE=D0=B2,=20?= =?UTF-8?q?=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B8=D0=B2=20=D1=84=D0=B8=D0=BB?= =?UTF-8?q?=D1=8C=D1=82=D1=80=D0=B0=D1=86=D0=B8=D1=8E=20=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=B8=20=D0=BF=D1=80=D0=B5=D0=B4=D0=BE?= =?UTF-8?q?=D1=82=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D1=8F=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BA=D0=B8=20=D0=BF=D1=80=D0=B8=20=D0=BD=D0=B5=D0=BA?= =?UTF-8?q?=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D1=8B=D1=85=20=D0=B7?= =?UTF-8?q?=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=D1=85=20=D0=BB=D0=B8?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/server.js | 8 ++++---- frontend/src/Dashboard.jsx | 3 ++- frontend/src/lib/api.js | 13 +++++++++---- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/backend/server.js b/backend/server.js index 62c5841..79e8fae 100644 --- a/backend/server.js +++ b/backend/server.js @@ -500,7 +500,7 @@ app.get('/api/domains', async (req, res) => { const { total } = await streamPaginatedText({ key: FILE_KEY, q, offset: 0, limit: 0, mapLine: () => ({}) }); setCountOnlyCache(cacheKey, total); return res.json(format === 'std' ? { items: [], total, meta: {} } : { total }); - } else if (typeof limit !== 'undefined') { + } else if (Number(limit) > 0) { const { items, total } = await streamPaginatedText({ key: FILE_KEY, q, @@ -596,7 +596,7 @@ app.get('/api/asns', async (req, res) => { const { total } = await streamPaginatedText({ key: 'bgp_data/asns.txt', q, offset: 0, limit: 0, mapLine: () => ({}) }); setCountOnlyCache(cacheKey, total); return res.json(format === 'std' ? { items: [], total, meta: {} } : { total }); - } else if (limit !== undefined) { + } else if (Number(limit) > 0) { const { items, total } = await streamPaginatedText({ key: 'bgp_data/asns.txt', q, @@ -693,7 +693,7 @@ app.get('/api/domains-new', async (req, res) => { const { total } = await streamPaginatedText({ key: 'bgp_data/domains_community.txt', q, offset: 0, limit: 0, mapLine: () => ({}) }); setCountOnlyCache(cacheKey, total); return res.json(format === 'std' ? { items: [], total, meta: {} } : { total }); - } else if (limit !== undefined) { + } else if (Number(limit) > 0) { const { items, total } = await streamPaginatedText({ key: 'bgp_data/domains_community.txt', q, @@ -790,7 +790,7 @@ app.get('/api/ip-ranges', async (req, res) => { const { total } = await streamPaginatedText({ key: 'bgp_data/ips.txt', q, offset: 0, limit: 0, mapLine: () => ({}) }); setCountOnlyCache(cacheKey, total); return res.json(format === 'std' ? { items: [], total, meta: {} } : { total }); - } else if (limit !== undefined) { + } else if (Number(limit) > 0) { const { items, total } = await streamPaginatedText({ key: 'bgp_data/ips.txt', q, diff --git a/frontend/src/Dashboard.jsx b/frontend/src/Dashboard.jsx index 92bb712..64405d2 100644 --- a/frontend/src/Dashboard.jsx +++ b/frontend/src/Dashboard.jsx @@ -102,7 +102,8 @@ function Dashboard() { const domains = []; const ipRanges = []; const asns = []; - const servers = serversRes.status === 'fulfilled' ? serversRes.value.data : []; + const serversRaw = serversRes.status === 'fulfilled' ? serversRes.value.data : []; + const servers = Array.isArray(serversRaw) ? serversRaw : []; setRaw({ domains, ipRanges, asns, servers }); const countries = new Set(servers.map(server => server.country).filter(Boolean)); const providers = new Set(servers.map(server => server.provider).filter(Boolean)); diff --git a/frontend/src/lib/api.js b/frontend/src/lib/api.js index 58703a9..58983c4 100644 --- a/frontend/src/lib/api.js +++ b/frontend/src/lib/api.js @@ -32,15 +32,20 @@ api.interceptors.response.use( if (method === 'get') { const key = buildCacheKey(response.config); const etag = response.headers?.etag; - if (etag) { - responseCache.set(key, { etag, data: response.data, headers: response.headers }); - } - // Если пришёл 304 (на всякий случай, axios обычно не кидает в success 304), подменим данными из кеша + // Если 304 — всегда пробуем вернуть кеш, не трогая response.data if (response.status === 304) { const cached = responseCache.get(key); if (cached) { return { ...response, status: 200, data: cached.data, headers: { ...cached.headers, 'x-from-cache': '1' } }; } + // нет кеша — вернём пустые семантически корректные данные (чтобы не падали .map) + // вызывающий код должен ожидать типы, поэтому лучше не подменять тип неожиданно. + // Просто пропустим дальше как есть — до второго интерсептора и обработчиков. + return response; + } + // Не 304: обновляем кеш, но только если есть валидный etag + if (etag) { + responseCache.set(key, { etag, data: response.data, headers: response.headers }); } } } catch {}