ExpressJS和在单独的路由文件之间传递变量
ExpressJS and passing variables between separate route files
我将ExpressJs与Node.js一起使用,并已将所有路由放入"routes"文件夹中。
在服务器上,我进行数据库连接,然后定义我的路由,如下所示:
var routes = require('./routes');
var db;
dbconnect = new mongo.Db(config.mongo_database, new mongo.Server(config.mongo_host, config.mongo_port, {}), {});
dbconnect.open(function (err, db) {
db.authenticate(config.mongo_user, config.mongo_pass, function (err, success) {
if (success) {
//routes/index.js
app.get('/', routes.index);
//routes/users.js
app.get('/users', routes.users);
}
});
});
我想访问每个路由javascript文件中的"db"对象。我该如何将它从这个"app.js"文件传递到index.js或users.js?
谢谢!
如果您在自己的文件/模块中编写数据库抽象,那么您可以根据需要在整个代码库中重用它,只需在需要的地方使用require()即可。如果您写得正确,它就不会被重新创建,并且可以像您的示例一样在应用程序启动时初始化一次。
//contents of your database.js file
var database;
module.exports = {
init : function(config, cb) {
database = new mongo.Db(config.mongo_database, new mongo.Server(config.mongo_host, config.mongo_port, {}), {});
database.open(function (err, db) {
db.authenticate(config.mongo_user, config.mongo_pass, cb);
});
},
query : function(params, cb) {
database.query(params, cb);
}
};
这是一个微不足道的例子,但希望它能说明问题。在控制器或任何需要数据库对象的文件中,您只需。。。
var db = require('database');
db.init(params, function(err, db) {
...
});
db.query(params, function(err, db) {
...
});
好处是您现在有了一个松散耦合的数据库对象,它可以在应用程序中的任何地方使用,就像通过require语句使用任何其他节点模块一样。
一个建议是通过一个接受db
参数的函数来公开您的路线:
routes.js:
module.exports = function(db) {
return {
index: function(req, res, next) {
// Funky db get stuff
}
}
}
将值包装在这样的闭包中并返回具有更多函数的对象是一种有用的模式,有时称为"揭示模块模式"。它清楚地显示了依赖关系,允许轻松测试(例如使用mock db对象),同时仍然使用灵活的函数方法。
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- 全局变量和全局对象的属性之间有什么区别吗
- 在索引.html和应用.js [node.js] 之间共享变量
- 什么是&&在没有if的行中的变量之间
- 在JavaScript中,如何修复元素显示和变量创建之间的初始差异
- 在Knockoutjs中的ViewModels之间共享变量状态
- 在控制器之间传递变量的最佳方式
- 通过变量在两个数字之间切换
- 在函数之间传递javascript变量
- 在aspx页面c#之间传递/引用/发送变量/会话状态
- 在两个浏览器选项卡之间共享变量范围
- Javascript创建函数,以便在其他函数之间共享变量
- 关于node.js/javascript在文件之间共享变量
- AngularJS:如何在控制器之间传递变量
- 使用 AngularJS 在控制器之间传递变量
- 创建一个变量并在页面之间移动时“存储它”,jQuery
- 在 AngularJS 和非 AngularJS 弹出窗口之间共享变量
- 我需要在jQuery函数和AJAX之间获取一个变量
- 在Ember.js中的方法之间共享变量上下文
- 控制器之间变量名和数据的奇怪行为