快速路线共享变量

时间:2012-10-16 12:51:47

标签: node.js express

我最近开始学习node.js + Express,发现它非常有趣。

我已经阅读了许多关于在路由中共享变量的帖子,其中许多都在使用module.exports和exports。

我决定创建一个设置局部变量的函数

routes / test.js

var db;
exports.setup = function(_db){
  db = _db;
};

exports.doit = function(req, res){
  db.get("testToken", function(err, result) { 
    console.log("err: " + err);
    console.log("result: " + result);
    res.send("respond with a resource");
  });
};

app.js

var redis = require("redis");
var db = redis.createClient();
var test = require("./routes/test.js");
test.setup(db);

// configuration...

app.get('/', test.doit);

这样做可以吗?

我想确保我不会多次创建数据库连接,并且共享变量是我能想到的唯一方式......

你能提出任何建议吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

这应该可以正常工作。但是,您可以考虑分离" setup"来自"路线。"

由于db始终是相同的值,因此您可以使用Express 3的prototype objects将其附加到所有req和/或res个对象中路线:

routes/test.js

exports.doit = function(req, res){
  req.db.get("testToken", function(err, result) { 
    console.log("err: " + err);
    console.log("result: " + result);
    res.send("respond with a resource");
  });
};

app.js

var redis = require("redis");
var db = redis.createClient();
var test = require("./routes/test.js");

// "setup"
express.request.db = express.response.db = db;

// configuration

app.get('/', test.doit);

尽管如此,您还可以定义" setup"作为自定义中间件:

// before: app.use(app.router);
app.use(function (req, res, next) {
  req.db = res.db = db;
  next();
});

答案 1 :(得分:1)

基本上,它看起来不错,但它可能是module.exports而不仅仅是exports

另外,我会将模块代码封装到自执行的匿名函数中,以防止名称冲突并声明module.exports一次。

这样的事情:

(function() {
  var _db;

  setup = function (db){
    _db = db;
  };

  doit = function (req, res){
    _db.get("testToken", function(err, result) { 
      console.log("err: " + err);
      console.log("result: " + result);
      res.send("respond with a resource");
    });
  };

  module.exports = {
    setup: setup,
    doit: doit
  }
}).call(this);