Экспресс-запрос на получение с :id-параметром, запускаемым дважды

У меня есть API, созданный с помощью node и express, и конечной целью является сохранение параметра :id из запроса в переменной, чтобы я мог запрашивать определенную таблицу из моей базы данных SQLite с определенным идентификатором. Теперь запрос на получение с параметром :id запускается дважды, один раз с URL-адресом запроса, который должен быть (в моем случае «страница»), и один раз с URL-адресом /serviceWorker.js.

Это код моего роутера с get-запросом:

import express from "express";
const router = express.Router();

router.get("/:id", function (req, res) {
  const id = req.params.id;
  console.info("id:", id);
  console.info("Req url:", req.url);
  res.send(id);
});

export default router

Журнал консоли из одного запроса на получение выглядит следующим образом:

id: molekylverkstan
Req url: /molekylverkstan
id: serviceWorker.js
Req url: /serviceWorker.js

Даже при выполнении запроса на получение моей домашней страницы с этим кодом:

router.get("/", function (req, res) {
  res.render("../pages/start.ejs");
});

Я получаю журнал консоли:

id: serviceWorker.js
Req url: /serviceWorker.js

Я пытался прервать запрос с помощью break(), return и next(), но ничего не получилось. У меня нет сервисного работника в моем проекте, что заставляет меня задаться вопросом, почему он появляется из ниоткуда. Может быть, мне нужен какой-то сервис-воркер или где-то в моем проекте конкретно указано, что он не должен его искать?

Ваш маршрут захватывает все, поэтому любой запрос GET, попадающий на ваш сервер, будет запущен. Возможно, вы хотите более конкретный маршрут?

Evert 23.11.2022 21:21

Ладно, разумно. Дело в том, что я бы хотел, чтобы API работал так: когда новый клиент покупает мой продукт, его страницы загружаются в мою базу данных, и они получают определенный URL-адрес, который соответствует их таблице в базе данных. В этом случае, если их конкретный URL-адрес «customer1», тогда их таблица в моей базе данных будет называться «customer1», и эта вещь: id, которая принимает все, будет универсальной, так что мне не придется делать новый маршрут для каждого клиента. Имеет ли это смысл?

Pontus Olsson 23.11.2022 21:27

Если вы хотите, чтобы все они обрабатывались в корне (так что /customer1, вам нужно вызвать функцию next(), чтобы гарантировать, что другие маршруты получат возможность обрабатывать пути, которые не имеют соответствующего клиента в базе данных. Кроме того, вам нужно убедитесь, что никто не может создать клиента, который пересекается с другими нужными вам маршрутами.

Evert 23.11.2022 21:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Даже если в вашем проекте нет сервисного работника, в вашем браузере все еще может быть зарегистрирован один из предыдущего проекта, который вы запускали в том же домене/IP-адресе в прошлом.

Причина, по которой вы получаете этот запрос, заключается в том, что в вашем браузере больше нет действительной кэшированной версии сервис-воркера, и он пытается перезагрузить ее. Но поскольку этот запрос терпит неудачу, он будет пытаться снова и снова.

Чтобы удалить его, откройте соответствующий веб-сайт и проверьте инструменты разработчика браузера (Application -> Service Workers или chrome и firefox) и отмените регистрацию всех сервисных работников, которые вы больше не хотите использовать.

Хорошо, отмена регистрации сработала как по маслу, но теперь вместо этого он пытается загрузить значок. У вас случайно нет быстрого решения для этого? ;Д

Pontus Olsson 23.11.2022 21:49

ну, единственное решение для этого было бы фактически обслуживать фавикон. Другим решением может быть указание пользовательского URL-адреса значка в разделе <head>, но некоторые браузеры все равно будут пытаться сделать этот запрос еще до загрузки веб-сайта. Я бы сказал, что лучшее, что вы можете сделать, это поставить express.static с параметром fallthrough, установленным перед обработчиком API, чтобы обслуживать любой статический контент (например, иконки favicon, css, изображения и т. д.). Затем в обработчике API проверьте, существует ли :id в базе данных, и если нет, то просто верните 404.

nezu 24.11.2022 01:08

Другие вопросы по теме