【问题标题】:Dynamically change Express routes on CMS update在 CMS 更新时动态更改 Express 路线
【发布时间】:2019-02-15 12:11:01
【问题描述】:

我有一个使用 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)获取路由(例如博客部分)的 slug。我想知道当应用程序已经运行时,我如何处理管理员更改 CMS 中的 slug?

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

【问题讨论】:

    标签: javascript express next.js contentful


    【解决方案1】:

    您可以使用变通方法以在 express 中执行动态路由。这是我在我的 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()
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 2019-02-04
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      相关资源
      最近更新 更多