【发布时间】:2013-09-06 23:17:19
【问题描述】:
我是 Node 新手,我正在尝试使用 ExpressJS (http://expressjs.com/) 创建一个 MVC 应用程序。我使用的文件夹结构与 GitHub 上的 MVC 示例 (https://github.com/visionmedia/express/tree/master/examples/mvc) 相同。
在我的控制器文件夹中,我有 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 工作。系统可以工作,但对于 main 我在继承调用时收到此错误:
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;
【问题讨论】:
-
在这种情况下,system 和 main 都是简单的对象。
util.inherits的两个参数都需要是构造函数。 -
我不确定我是否遵循。我试过把 main.constructor、main.prototype 和 main.prototype.constructor 都放进去,但它们都不起作用?
-
系统被初始化为 {},它是一个
Object类型的空对象。我很快就会在我的答案中添加一个使用相同名称和目录结构的更新。
标签: javascript node.js express dot.js