[英]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
查詢來自該國家/地區的用戶。
有更好的方法來創建所有這些嗎? 有最佳做法嗎?
在網上我沒有看到類似的東西,但是我認為擁有這樣的東西應該很受歡迎。
希望您能提供幫助。
從我可以從您的問題中看出,您希望能夠在顯式提供國家/地區代碼時以及默認情況下希望顯示所有用戶(學生,教師或兩者)或使用先前提供的國家/地區代碼來處理。 讓我知道這是否不是您的意圖。
要回答您的第一個問題, /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
要為教師或學生指定新的國家/地區代碼,一個解決方案是定義類似/: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”)。
由於我們現在知道可以記住先前設置的國家/地區代碼,因此您只需具有一個鏈接到/teachers
等的菜單,您仍然可以使用會話變量中的國家/地區代碼。
我希望這有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.