每次我用新的菜單項更新數據庫時,我試圖讓路由更新一個路由。這是我的悲傷小丑嘗試:Express.js動態路由 - 這甚至可能嗎?
這裏在app.js,我檢查菜單數據庫和shazaam ...路線在啓動在飛行。酷!:
// in app.js //
var attachDB = function(req, res, next) {
req.contentdb = db.content;
req.menudb = db.menu;
req.app = app; // this is the express() app itself
req.page = PageController;
next();
};
db.menu.find({}, function (err, menuitems){
for(var i=0; record = menuitems[i]; i++) {
var menuitem = record.menuitem;
app.all('/' + menuitem, attachDB, function(req, res, next) {
console.log('req from app all route: ',req)
PageController.run(menuitem, req, res, next);
});
}
http.createServer(app).listen(config.port, function() {
console.log(
'\nExpress server listening on port ' + config.port
);
});
});
不是真正的優雅,但它是一種概念證明。現在問題是:當我在Admin.js文件中保存一個新的菜單項時,數據庫get被更新,路由器似乎得到更新,但點擊帶有動態創建的路由的菜單鏈接後,該請求剛好爆炸
請求中的很多東西似乎都已丟失,我覺得有些基本的東西我不明白路由,回調或者這可能只是錯誤的解決方案。這裏就是負責創建一個新的菜單項,並創造了我的Admin.js文件的新路徑的功能看起來像:
// in Admin.js //
menuItem: function(req, res, callback) {
var returnMenuForm = function() {
res.render('admin-menuitem', {}, function(err, html) {
callback(html);
});
};
var reqMenudb = req.menudb,
reqContentdb = req.contentdb,
reqApp = req.app,
reqPage = req.page;
if(req.body && req.body.menuitemsubmitted && req.body.menuitemsubmitted === 'yes') {
var data = { menuitem: req.body.menuitem };
menuModel.insert(data, function(err) {
if (err) {
console.log('Whoa there...',err.message);
returnMenuForm();
} else {
// data is inserted....great. PROBLEM...the routes have not been updated!!! Attempt that mimics what I do in app.js here...
reqApp.all('/' + data.menuitem, function(req, res, next) {
// the 2 db references below are set with the right values here
req.contentdb = reqContentdb;
req.menudb = reqMenudb;
next();
}, function(req, res, next) {
reqPage.run(data.menuitem, req, res, next);
});
returnMenuForm();
}
});
} else {
returnMenuForm();
}
},
在管理部分保存數據的正常工作。如果您控制檯登錄app.routes,它甚至會顯示一條非常酷的新路線。但是,在刷新頁面並單擊新路由應該工作的鏈接後,我得到一個未定義的錯誤。
管理員將數據傳遞到我的頁面控制器:
// in PageController.js //
module.exports = BaseController.extend({
name: "Page",
content: null,
run: function(type, req, res, next) {
model.setDB(req.contentdb); /* <-- problem here, req.contentdb is undefined which causes me problems when talking to the Page model */
var self = this;
this.getContent(type, function() {
var v = new View(res, 'inner');
self.navMenu(req, res, function(navMenuMarkup){
self.content.menunav = navMenuMarkup;
v.render(self.content);
});
});
},
getContent: function(type, callback) {
var self = this;
this.content = {}
model.getlist(function(records) {
if(records.length > 0) {
self.content = records[0];
}
callback();
}, { type: type });
}
最後,錯誤的一點是這裏的模型
// in Model.js //
module.exports = function() {
return {
setDB: function(db) {
this.db = db;
},
getlist: function(callback, query) {
this.db.find(query || {}, function (err, doc) { callback(doc) });
},
在
這裏終於看到了「這個」上面的獲取列表方法是未定義的,並導致頁面被彈出。
如果我重新啓動服務器,由於我的動態加載器在app.js中,所有事情都可以再次運行。但是在更新數據庫之後沒有一些方法可以重新加載路由嗎?我的技術在這裏不起作用,並且將主應用程序傳遞給控制器是件醜陋的事,因爲我正在這裏做。
這是代碼的一個很好的例子,讓我走向正確的方向,組織良好。今天我學到了一個新的竅門。謝謝你,茲拉特科。 –
你的評論是更好的司機回答人們的問題,然後聲譽點:) – Zlatko