重新注册节点路由

Reregister node routes

我想知道路线注册后是否可以更改。我正在启动一个网站,一旦发出请求,我需要检查该网站是否启动。如果是,那么我希望呈现实际的网站。否则,我需要显示即将推出的页面。由于发布将在现场活动中进行,因此我需要更改值。因此,例如,我向主页发出请求,该网站尚未启动,那么它应该显示即将推出的页面,如果是,那么它会显示主页。现在,我有一个布尔值 isLaunched=false 初始化。当来宾启动它时,我将值更改为 true 并且我想呈现整个网站。为此,我使用了 if else 条件语句——例如:

if(!isLaunched){

...用于启动页面的一些路由。

  app.get("*",function(req,res){
    res.render("coming-soon");
  });

}else{
  app.get("/",function(req,res){
    res.render("home");
  });

...所有路线

}

现在要进行此更改,我将它们包装在一个函数中以便可以更新它们。

函数 updateRoutes(){

if(!isLaunched){

...用于启动页面的一些路由。

  app.get("*",function(req,res){
    res.render("coming-soon");
  });

}else{
  app.get("/",function(req,res){
    res.render("home");
  });

...所有路线

}

}

所以现在,在我检查网站是否启动后,我可以调用这个函数来注册。但是,这不起作用。它仍然显示所有路线的即将推出页面。

isLaunched=true;
updateRoutes();
 

请帮我解决这个问题。我不知道为什么这不起作用。路由可以重新注册吗?请提出一个可能的解决方案。

提前谢谢你。 祝你有美好的一天!

为此,您可以使用捕获所有请求的中间件,然后仅当 isLaunchedtrue 时才让请求转到其适当的处理程序。

const app = express();

app.use('*', (req, res, next) => {
    if (isLaunched || req.path === '/coming-soon') {
        return next()
    }

    res.redirect('/coming-soon')

    // You can also render if you want
    // res.render('coming-soon')
})

// Other routes here

编辑

要定义在 isLaunched 为真时应可访问的路由,您可以在中间件之后定义这些路由。如果你没有在中间件中调用 next() 方法,它不会转到下一个处理程序。所以如果 isLaunched 不是真的,你永远不会调用 next()

app.get('/login', handler)
app.get('/register', handler)

所以基本上你知道定义你通常如何定义路线。

编辑 2:

如果您希望在 isLaunched 为 false 时可以访问多个路由,您可以在使用中间件之前定义这些路由。

在 Express 中,不支持更改、编辑或删除您已注册的路线的方法。可以通过破解 Express 中的内部 (non-documented) 数据结构来实现。

更典型的是,您只需创建一个路由处理程序,其中包含自己的条件逻辑,以便路由处理程序决定应在路由处理程序中应用哪个逻辑。因此,不是有两个路由处理程序并切换它们,而是有一个永久路由处理程序,它有自己的条件逻辑来决定如何在给定当前状态下采取行动。

如果你想要一个可以响应所有页面的路由,那么你只需使用 app.use() 中间件。

// middleware that sends coming-soon page if not launched yet
app.use(function(req, res, next){
    if (!isLaunched) {
        // don't go to any other route handlers
        res.render("coming-soon");
    } else {
        // continue processing to other route handlers
        next();
    }
});

// other routes that get hit if isLaunched is true
app.get("/",function(req, res){
    res.render("home");
});