ExpressJS和在单独的路由文件之间传递变量

ExpressJS and passing variables between separate route files

本文关键字:之间 变量 文件 路由 单独 ExpressJS      更新时间:2023-09-26

我将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对象),同时仍然使用灵活的函数方法。