Expressjs 动态路由问题

Expressjs dynamic routing issues

本文关键字:问题 路由 动态 Expressjs      更新时间:2023-09-26

我正在使用Express 4.0,我正在尝试创建一个路由,在主页上显示来自所有国家/地区的所有用户。

切换国家 我希望向来自该国家的所有用户展示。

还有两种用户(教师和学生),我也希望在那里做同样的事情。

在教师页面上,我希望

显示所有教师,并根据(以前或非)所选国家/地区,我希望看到来自该国家的教师......

我在执行此操作时遇到了几个问题:

1)主页工作正常,带有/:countryCode的主页工作正常,/teachers/students不再加载...如果我把/:countryCode放在其他页面加载的所有内容下面......(?!?).

2) 我是否还必须创建这样的路由:/:countryCode/teachers?或者有一种方法可以将国家代码存储在某处...?

3)在菜单中,似乎我必须创建2个不同的菜单,一个普通菜单和一个带有国家代码扩展名的菜单......

目前我的路由是这样的:

app.get('/', homeController.index);
app.get('/:countryCode', homeController.indexByCountry);
app.get('/teachers', userController.getTeachers);
app.get('/students', userController.getStudents);

我正在使用参数:countryCode查询来自该国家/地区的用户。

有更好的方法来创造这一切吗?有什么最佳实践吗?

在网上我没有看到类似的东西,但我认为拥有这样的东西应该很受欢迎。

希望你能帮上忙。

根据我从您的问题中得出的信息,您希望能够在明确提供国家/地区代码时进行处理,以及您希望显示所有用户(学生、教师或两者)或使用以前提供的国家/地区代码的默认设置。如果这不是您的意图,请告诉我。

问题1:

要回答您的第一个问题,/teachers/students无法加载的原因是它们被匹配为国家/地区代码。我的理解是,快递将按照定义的顺序优先处理您的路线。

正弦/:countryCode定义在 url /teachers将调用homeController.indexByCountry的其他两条路由之上,countryCode参数等于 "teachers" 。通过在/:countryCode路由上方定义这些路由,它们将具有优先级并按预期工作。所以:

app.get('/', homeController.index); // Express will check this first
app.get('/teachers', userController.getTeachers); // Then this
app.get('/students', userController.getStudents); // Then this
app.get('/:countryCode', homeController.indexByCountry); // And finally this

问题2:

要为教师或学生指示新的国家/地区代码,一种解决方案可能是定义像/:countryCode/teachers这样的路线(或者对我来说更有意义的/teachers/:countryCode)。

但是,如果您想保存国家/地区代码,则可以使用会话。有一个名为 express-session 的快速中间件包,它将帮助您做到这一点。

例如:

var express = require('express');
var session = require('express-session');
var app = express();
// Tell the express app to use the session middleware
app.use(session({
  secret: 'app secret key',
  resave: false,
  saveUninitialized: true
}));
app.get('/', function(req, res) {
  if (req.session.countryCode) { // If country code has been set
    res.send('Homepage, country code is currently ' + req.session.countryCode);
  } else {
    res.send('Homepage, country code not set');
  }
});
// Define routes for '/teachers' and '/students' etc.
app.get('/:countryCode', function(req, res) {
  // Set the countryCode property of the session object to the :countryCode
  // variable in the url
  req.session.countryCode = req.params.countryCode;
  res.send("Homepage, country code is now " + req.session.countryCode);
});
app.listen(3000);

尽管我遇到的一个问题是,当我在Web浏览器中访问服务器时,它会发送GET请求来查找图标,这被解释为国家/地区代码并将其设置为"favicon.ico"。

一种解决方法可能是在设置会话变量之前检查提供的国家/地区代码是否符合某些特定格式,例如,如果您希望国家/地区代码始终为 2 个字符的字符串(例如。"英国"或"法国")。

问题3:

由于我们现在知道我们可以记住之前设置的国家/地区代码,因此您只需提供一个链接到/teachers等的菜单,您仍然可以使用会话变量中的国家/地区代码。

我希望这有所帮助。