我正在使用expressjs编写一个应用程序。我的观点通常在/views文件夹中。它们满足了我客户90%的需求,但有时我不得不覆盖其中的一个或另一个视图来添加定制的功能。我真的很想知道我能构建一个文件夹结构,比如:
*{ ...other expressjs files and folders...}*
/views
view1.jade
view2.jade
view2.jade
/customerA
view2.jade
/customerB
view3.jade
我想覆盖expressjs的response.render()函数的行为,以应用以下算法:
1. a customer requests a view
2. if /{customer_folder}/{view_name}.jade exists, than
render /{customer_folder}/{view_name}.jade
else
render /views/{view_name}.jade
因此,对于customerA,response.render('view1')将指[em>/views/view1.jade//strong>,而response.rende('view2')将指/customerA/view2.jade(那些使用appcelerator钛合金的人可能听起来很熟悉)
我想要一种优雅的方式来实现这种行为,而不需要修改expressjs的核心功能,因此可能会在升级我的框架时受到处理。我想这是一个常见的问题,但我在网上找不到任何文章。
我会创建一个自定义的View
类:
var express = require('express');
var app = express();
var View = app.get('view');
var MyView = function(name, options) {
View.call(this, name, options);
};
MyView.prototype = Object.create(View.prototype);
MyView.prototype.lookup = function(path) {
// `path` contains the template name to look up, so here you can perform
// your customer-specific lookups and change `path` so that it points to
// the correct file for the customer...
...
// when done, just call the original lookup method.
return View.prototype.lookup.call(this, path);
};
app.set('view', MyView);
您可以挂接http.ServerResponse.render
。
以下是我脑海中的一些代码,将用作中间件:
var backup = res.render
res.render = function() {
//Do your thing with the arguments array, maybe use environment variables
backup.apply(res, arguments) //Function.prototype.apply calls a function in context of argument 1, with argument 2 being the argument array for the actual call
}