Я новичок в Node, и я пытаюсь создать приложение MVC с помощью ExpressJS (http://expressjs.com/). Я использую ту же структуру папок, что и пример MVC (https://github.com/visionmedia/express/tree/master/examples/mvc) на GitHub.Как создать расширяемые контроллеры в ExpressJS
В моей папке контроллеров у меня есть 2 папки: основная и системная. Я хотел бы иметь базовый контроллер, определенный в /controllers/system/index.js, и /controllers/main/index.js наследует системный контроллер. Каждый другой модуль расширяет систему и отменяет несколько функций для создания страницы.
В другом учебнике я нашел следующий код.
base.js
var _ = require("underscore");
module.exports = {
name: "base",
extend: function(child) {
return _.extend({}, this, child);
},
run: function(req, res, next) {
}
};
Home.js
var BaseController = require("./Base"),
View = require("../views/Base"),
model = new (require("../models/ContentModel"));
module.exports = BaseController.extend({
name: "Home",
content: null,
run: function(req, res, next) {
model.setDB(req.db);
var self = this;
this.getContent(function() {
var v = new View(res, 'home');
v.render(self.content);
})
},
getContent: function(callback) {
var self = this;
this.content = {};
model.getlist(function(err, records) {
if(records.length > 0) {
self.content.bannerTitle = records[0].title;
self.content.bannerText = records[0].text;
}
model.getlist(function(err, records) {
var blogArticles = '';
if(records.length > 0) {
var to = records.length < 5 ? records.length : 4;
for(var i=0; i<to; i++) {
var record = records[i];
blogArticles += '\
<div class="item">\
<img src="' + record.picture + '" alt="" />\
<a href="/blog/' + record.ID + '">' + record.title + '</a>\
</div>\
';
}
}
self.content.blogArticles = blogArticles;
callback();
}, { type: 'blog' });
}, { type: 'home' });
}
});
Как вы это делаете без функции расширения Underscore в? У Express есть встроенный метод расширения модулей? Я использую doT.js для шаблонов, поэтому я не хочу включать другую большую библиотеку для одной функции.
Спасибо!
Редактировать: Придется внести несколько изменений, чтобы получить базовый код из dc5 для работы. Система работает, но для магистрали я получаю эту ошибку на наследуют вызов:
util.js:555
ctor.prototype = Object.create(superCtor.prototype, {
^
TypeError: Object prototype may only be an Object or null
at Function.create (native)
at Object.exports.inherits (util.js:555:27)
/controllers/system/index.js:
var util = require('util'),
system = { };
system.index = function(req, res, next) {
res.render('main');
};
module.exports = system;
/controllers/main/index.js:
var util = require('util'),
system = require('./../system/index'),
main = { };
util.inherits(main, system);
module.exports = main;
В этом случае как система, так и основной являются простыми объектами. Оба аргумента 'util.inherits' должны быть конструкторами. – dc5
Я не уверен, что я следую. Я попытался поставить main.constructor, main.prototype и main.prototype.constructor, и никто из них не работал? – Jonathan
система инициализируется {}, которая является пустым объектом типа 'Object'. Я добавлю обновление к моему ответу, которое в ближайшее время будет использовать те же имена и структуру каталогов. – dc5