在CMS更新中动态更改Express路由

时间:2019-02-15 12:11:02

标签: javascript express next.js contentful

我有一个使用NextJS的项目,其中Express用于服务器端路由。

lib / routes / 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中的信息吗?

猜测,我将需要重新启动应用程序才能使新的条/路由正常工作。在这种情况下,我是否需要使用Webhook并监听CMS中的更改,然后以编程方式重新启动应用程序?这可能有效,但可能会增加开销。有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用变通办法来快速进行动态路由。这是我在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()来响应内容丰富的Webhook。

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