簡體   English   中英

Express.js動態路由問題

[英]Expressjs dynamic routing issues

我使用的是Express 4.0,並且試圖創建一個路由,以在首頁中顯示來自所有國家/地區的所有用戶。

切換國家/地區我希望顯示該國家/地區的所有用戶。

還有2種用戶(教師和學生),我也希望在那里也做同樣的事情。

我希望在“教師”頁面上顯示所有教師,並希望基於(先前(或未曾))所選國家/地區來查看該國家/地區的教師...

我這樣做有幾個問題:

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);

我正在使用param :countryCode查詢來自該國家/地區的用戶。

有更好的方法來創建所有這些嗎? 有最佳做法嗎?

在網上我沒有看到類似的東西,但是我認為擁有這樣的東西應該很受歡迎。

希望您能提供幫助。

從我可以從您的問題中看出,您希望能夠在顯式提供國家/地區代碼時以及默認情況下希望顯示所有用戶(學生,教師或兩者)或使用先前提供的國家/地區代碼來處理。 讓我知道這是否不是您的意圖。

問題1:

要回答您的第一個問題, /teachers/students不會加載的原因是它們被匹配為國家/地區代碼。 我的理解是,快速快遞將按照定義的路線優先安排您的路線。

正弦/:countryCode定義在url /teachers將在countryCode參數等於"teachers"調用homeController.indexByCountry的其他兩條路由之上。 通過在/: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個字符串(例如“ uk”或“ fr”)。

問題3:

由於我們現在知道可以記住先前設置的國家/地區代碼,因此您只需具有一個鏈接到/teachers等的菜單,您仍然可以使用會話變量中的國家/地區代碼。

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM