gpt4 book ai didi

javascript - 如何在 ExpressJS 中创建可扩展 Controller

转载 作者:搜寻专家 更新时间:2023-10-31 22:59:43 26 4
gpt4 key购买 nike

我是 Node 新手,我正在尝试使用 ExpressJS ( http://expressjs.com/ ) 创建一个 MVC 应用程序。我使用的文件夹结构与 GitHub 上的 MVC 示例 ( https://github.com/visionmedia/express/tree/master/examples/mvc) 相同。

在我的 Controller 文件夹中,我有 2 个文件夹:main 和 system。我想要的是在/controllers/system/index.js 中定义一个基本 Controller ,并让/controllers/main/index.js 继承系统 Controller 。每个其他模块都会扩展系统并覆盖一些功能以生成页面。

在另一个教程中我找到了下面的代码。

基础.js

var _ = require("underscore");
module.exports = {
name: "base",
extend: function(child) {
return _.extend({}, this, child);
},
run: function(req, res, next) {

}
};

首页.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对于你所描述的。它不是 _.extend() 的替代品,但上面的示例所需的只是直接继承。

用法:util.inherits(constructor, superConstructor)

基础.js:

var util = require('util');

function Base() {…}

Base.prototype.run = function(req,res,next) {…}
module.exports = Base;

home.js:

var util = require('util');
var BaseController = require("./base");

function Home() {…}

util.inherits(home, BaseController);

Home.prototype.run = function(req,res,next) {…}

或者一个标准的JS继承模式:

基础.js:

function Base() {…}

Base.prototype.run = function(req,res,next) {…}
module.exports = Base;

home.js:

var BaseController = require("./base");

function Home() {
BaseController.apply(this, arguments);
}

Home.prototype = Object.create(BaseController.prototype);
Home.prototype.run = function(req,res,next) {…}

从问题中更新的样本来看,模块应该是这样的:

系统:

var util = require('util');

function System() {
this.txt = "hello from ";
this.name = "System";
}

System.prototype.sayHello = function() {
console.log(this.txt + this.name);
}

System.prototype.run = function(req,res,next) {
this.sayHello();

console.log('calling ==> overrideMe');
this.overrideMe();

console.log('calling ==> noOverride');
this.noOverride();
next ? next() : "";
}

System.prototype.overrideMe = function() {
console.log('System.overrideMe');
}

System.prototype.noOverride = function() {
console.log('System.noOverride');
}


module.exports = System;

主要内容:

var util = require('util');
var System = require("../system/");

function Main() {
// Makes sure the System constructor is run
System.apply(this, arguments);
this.name = "Main";
}

util.inherits(Main, System);

Main.prototype.run = function(req,res,next) {
this.sayHello();

console.log('calling ==> overrideMe');
this.overrideMe();

console.log('calling ==> noOverride');
this.noOverride();

next ? next() : "";
}

Main.prototype.overrideMe = function() {
console.log('Main.overrideMe');
}

module.exports = Main;

root 中的 app.js - 一个简化的 express 服务器:

var System  = require('./controllers/system');
var Main = require('./controllers/main');
var express = require('express');
var path = require('path');
var http = require('http');
var app = express();
var server;

var system = new System();
var main = new Main();

app.configure(function() {
"use strict";
app.set('port', process.env.PORT || 3000, '127.0.0.1');
app.use(system.run.bind(system));
app.use(main.run.bind(main));
app.use(app.router);
//app.use(express.compress());
app.use(express.static(path.join(__dirname, '..', 'public'), {redirect: false}));
app.use(express.static(path.join("/Users/dave/personal/playground/yo"), {redirect: false}));
});


server = http.createServer(app);
server.listen(app.get('port'), function() {
"use strict";
console.log("Express server listening on port " + app.get('port'));
});

从浏览器访问:http://localhost:3000/

控制台输出:

Express server listening on port 3000
hello from System
calling ==> overrideMe
System.overrideMe
calling ==> noOverride
System.noOverride
hello from Main
calling ==> overrideMe
Main.overrideMe
calling ==> noOverride
System.noOverride

重要

因为这个例子是使用SystemMain的实例来提供路由,run方法在传递时必须绑定(bind)到实例表达。请参阅:MDN .bind documentation获取更多信息。

关于javascript - 如何在 ExpressJS 中创建可扩展 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18667954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com