У меня есть 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(), но ничего не получилось. У меня нет сервисного работника в моем проекте, что заставляет меня задаться вопросом, почему он появляется из ниоткуда. Может быть, мне нужен какой-то сервис-воркер или где-то в моем проекте конкретно указано, что он не должен его искать?
Ладно, разумно. Дело в том, что я бы хотел, чтобы API работал так: когда новый клиент покупает мой продукт, его страницы загружаются в мою базу данных, и они получают определенный URL-адрес, который соответствует их таблице в базе данных. В этом случае, если их конкретный URL-адрес «customer1», тогда их таблица в моей базе данных будет называться «customer1», и эта вещь: id, которая принимает все, будет универсальной, так что мне не придется делать новый маршрут для каждого клиента. Имеет ли это смысл?
Если вы хотите, чтобы все они обрабатывались в корне (так что /customer1
, вам нужно вызвать функцию next()
, чтобы гарантировать, что другие маршруты получат возможность обрабатывать пути, которые не имеют соответствующего клиента в базе данных. Кроме того, вам нужно убедитесь, что никто не может создать клиента, который пересекается с другими нужными вам маршрутами.
Даже если в вашем проекте нет сервисного работника, в вашем браузере все еще может быть зарегистрирован один из предыдущего проекта, который вы запускали в том же домене/IP-адресе в прошлом.
Причина, по которой вы получаете этот запрос, заключается в том, что в вашем браузере больше нет действительной кэшированной версии сервис-воркера, и он пытается перезагрузить ее. Но поскольку этот запрос терпит неудачу, он будет пытаться снова и снова.
Чтобы удалить его, откройте соответствующий веб-сайт и проверьте инструменты разработчика браузера (Application -> Service Workers
или chrome и firefox) и отмените регистрацию всех сервисных работников, которые вы больше не хотите использовать.
Хорошо, отмена регистрации сработала как по маслу, но теперь вместо этого он пытается загрузить значок. У вас случайно нет быстрого решения для этого? ;Д
ну, единственное решение для этого было бы фактически обслуживать фавикон. Другим решением может быть указание пользовательского URL-адреса значка в разделе <head>
, но некоторые браузеры все равно будут пытаться сделать этот запрос еще до загрузки веб-сайта. Я бы сказал, что лучшее, что вы можете сделать, это поставить express.static
с параметром fallthrough
, установленным перед обработчиком API, чтобы обслуживать любой статический контент (например, иконки favicon, css, изображения и т. д.). Затем в обработчике API проверьте, существует ли :id
в базе данных, и если нет, то просто верните 404.
Ваш маршрут захватывает все, поэтому любой запрос GET, попадающий на ваш сервер, будет запущен. Возможно, вы хотите более конкретный маршрут?