【发布时间】:2012-04-22 20:11:59
【问题描述】:
我想将我的路线分成不同的文件,其中一个文件包含所有路线,另一个文件包含相应的操作。我目前有一个解决方案来实现这一点,但是我需要将 app-instance 设为全局才能在操作中访问它。 我当前的设置如下所示:
app.js:
var express = require('express');
var app = express.createServer();
var routes = require('./routes');
var controllers = require('./controllers');
routes.setup(app, controllers);
app.listen(3000, function() {
console.log('Application is listening on port 3000');
});
routes.js:
exports.setup = function(app, controllers) {
app.get('/', controllers.index);
app.get('/posts', controllers.posts.index);
app.get('/posts/:post', controllers.posts.show);
// etc.
};
控制器/index.js:
exports.posts = require('./posts');
exports.index = function(req, res) {
// code
};
控制器/posts.js:
exports.index = function(req, res) {
// code
};
exports.show = function(req, res) {
// code
};
但是,此设置有一个大问题:我需要将一个数据库和一个应用程序实例传递给操作(控制器/*.js)。我能想到的唯一选择是将两个变量都设为全局变量,这并不是真正的解决方案。我想将路线与动作分开,因为我有很多路线并且希望它们位于中心位置。
将变量传递给动作但将动作与路由分开的最佳方式是什么?
【问题讨论】:
-
你的 controllers.js 看起来怎么样?也许你可以把它做成一个可以接收参数的函数(而不是一个对象)。
-
require('controllers') 需要控制器/index.js。但是,函数不起作用,因为我在路由中使用了对象(请参阅 routes.js),因此即使它是函数,也无法将参数传递给它。