Динамическое изменение экспресс-маршрутов при обновлении CMS - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть проект, использующий NextJS, с Express для маршрутизации на стороне сервера.

lib / router / getPages

const routes = require('next-routes')();
const getEntries = require('../helpers/getEntries');

module.exports = async (app) => {
  const { items: [globalSetings] } = await getEntries({
    content_type: 'xxxxxxxx',
    include: 1,
    limit: 1,
  });

  routes
    .add('/', 'index')
    .add(`/${globalSettings.fields.blogSlug}/:slug`, 'blog');

  return routes.getRequestHandler(app);
};

server.js

const express = require('express');
const next = require('next');
const getPages = require('./lib/routes/getPages');

const app = next();

app.prepare().then(async () => {
  const server = express();
  const pageRoutes = await getPages(app);
  server.use(pageRoutes);
  server.listen(3000);
});

Я получаю слагов для маршрутов (таких как раздел блога) из моего CMS API (который в данном случае является Contentful).Мне интересно, как я справляюсь с администратором, меняющим слаг в CMS, когда приложение уже запущено?

Догадываясь, мне нужно будет перезапустить приложение, чтобы новый слаг / маршрут заработал.В этом случае мне нужно будет использовать веб-крючок и прослушивать изменения в CMS, а затем каким-то образом перезапустить приложение программным способом?Это может сработать, но может добавить накладных расходов.Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 03 мая 2019

Вы можете использовать обходной путь для создания динамических маршрутов в экспрессе.Вот что я использую в своем приложении Typescript:

  // https://github.com/expressjs/express/issues/2596
  let dynamicRouter: express.Router
  app.use(
    (req, res, next) => dynamicRouter(req, res, next),
  )

  function loadMyRoutes() {
    const newRouter = express.Router()
    const newMiddleware = // load my new middleware

    newRouter.use(newMiddleware)

    dynamicRouter = newRouter
  }

Затем вы можете позвонить loadMyRoutes() в ответ на Contentful webhook.

app.post(`/webhook`, () => {
  loadMyRoutes()
})
...