重新注册节点路由
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();
请帮我解决这个问题。我不知道为什么这不起作用。路由可以重新注册吗?请提出一个可能的解决方案。
提前谢谢你。
祝你有美好的一天!
为此,您可以使用捕获所有请求的中间件,然后仅当 isLaunched
为 true
时才让请求转到其适当的处理程序。
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");
});
我想知道路线注册后是否可以更改。我正在启动一个网站,一旦发出请求,我需要检查该网站是否启动。如果是,那么我希望呈现实际的网站。否则,我需要显示即将推出的页面。由于发布将在现场活动中进行,因此我需要更改值。因此,例如,我向主页发出请求,该网站尚未启动,那么它应该显示即将推出的页面,如果是,那么它会显示主页。现在,我有一个布尔值 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();
请帮我解决这个问题。我不知道为什么这不起作用。路由可以重新注册吗?请提出一个可能的解决方案。
提前谢谢你。 祝你有美好的一天!
为此,您可以使用捕获所有请求的中间件,然后仅当 isLaunched
为 true
时才让请求转到其适当的处理程序。
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");
});