Dynami c express. js маршруты на основе записей базы данных без перезапуска - PullRequest
1 голос
/ 17 июня 2020

Я создал приложение Keystone JS v5 с настраиваемым экземпляром Express для обслуживания данных. Мои данные хранятся в базе данных Postgres, которая содержит следующую модель:

CREATE TABLE "Link" (
    id integer DEFAULT PRIMARY KEY,
    customer text,
    slug text
);

Я построил динамические c маршруты на основе атрибутов slug:

knex('Link').select('slug').then(function(result){
  const data = result.map(x => x.slug)
  data.forEach(url => {
    express.get(`/${url}`, function (req, res) {
      res.render('index');
    })
  });
});

Все работает как ожидалось, но мне приходится перезапускать сервер узла каждый раз, когда я вставляю новый слаг в таблицу ссылок. Вы знаете, как этого избежать? Спасибо!

1 Ответ

2 голосов
/ 17 июня 2020

Это может быть не полный ответ, но вот что-то вроде того, что вы ищете.

  1. Убедитесь, что мы принимаем любые пули на маршруте
  2. Я используется функция asyn c для ожидания результатов из БД
  3. Отображает представление индекса (если слаг был найден) или отвечает 404, если в таблице не было найдено записей

Предупреждение, я не использовал keystone JS или этот пакет knex js, поэтому он может быть не на 100% правильным, но должен быть хорошим примером того, чего мы пытаемся достичь. Я предполагаю, что knex js отклоняет обещание, если результаты не найдены, но я не уверен.

express.get(`/:slug`, async function (req, res) {
    try {
        const result = await knex('Link')
            .where({ slug: req.params.slug })
            .select('id');

        return res.render('index');
    } catch {
        return res.status(404).send({ message: "Not found" });
    }
});

Если вы используете старую версию Node.js, вот версия без асинхронный c.

express.get(`/:slug`, function (req, res) {
    knex('Link')
        .where({ slug: req.params.slug })
        .select('id')
        .then((result) => {
            return res.render('index');
        })
        .catch(() => {
            return res.status(404).send({ message: "Not found" });
        });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...