在PHP应用程序中,我可以创建类层次结构
class UserController extends Controller {
public function __constructor(){
//..
}
}
class LoggedUserController extends UserController {
protected $_loggedUser;
public function __constructor(){
if( empty($_SESSION['user']) ){
die('Access denied');
}
else{
$this->_loggedUser = $_SESSION['user'];
}
}
}
class MessagesController extends LoggedUserController {
public function action_get_all(){
// here I can use $this->_loggedUser and be sure that it is not empty
// Something like that:
$messages = ORM::factory('messages')->where('user_id', '=', $this->_loggedUser->id)->find_all();
}
}
以同样的方式,我可以创建类 AdminUserController 并确保该控制器对非管理员用户不可用。
但是在 Node 中.js我不能使用这个技巧,因为当加载应用程序时,controolers 的构造函数只会被调用一次。
也许有一些方法可以在 Node.js 中实现这一目标?
您可以使用 CoffeeScript 在 NodeJS 中实现类似的东西。与使用普通JavaScript相比,CoffeeScript允许您以更简洁的方式创建类和其他构造。虽然涉及学习曲线,但这可能是值得的。
就问题的第二部分而言,您将以不同的方式做同样的事情。您可以使用请求链来实现这一点,以便使用 ExpressJS。例如,考虑以下(常规 JavaScript 方法):
app.requiresAdminUser = function(req, res, next) {
if (req.session.user.role.indexOf('admin') > -1) return next();
return res.send("Not Authorized", 401);
}
app.get('/site/public/page', function(req, res) {
res.render('mypage');
});
app.get('/site/admin/secure', app.requiresAdminUser, function(req, res) {
res.render('mysecurepage');
});
我相信代码是不言自明的。如果任何部分不清楚,请回答您的问题。
CoffeeScript 可以使上面的代码看起来更干净。此外,当您进入一个完整的应用程序时,您可以将此类代码放入 CoffeeScript 类中,并在主应用程序文件中实例化它们,并将方法传递到路由定义中。
干杯