2

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

我读过很多关于在路由中共享变量的帖子,其中很多都在使用 module.exports 和 export。

我决定做一个函数来设置一个局部变量

路线/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");
  });
};

应用程序.js

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

// configuration...

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

可以做这样的事情吗?

我想确保我不会多次建立数据库连接,并且共享 vars 是我能想到的唯一方法......

你能提出任何建议吗?

谢谢!!

4

2 回答 2

3

那应该可以正常工作。不过,您可能会考虑将“设置”与“路由”分开。

由于db总是相同的值,您可以使用 Express 3 的prototype对象将其附加到所有路由中的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);

不过,您也可以将“设置”定义为自定义中间件:

// before: app.use(app.router);
app.use(function (req, res, next) {
  req.db = res.db = db;
  next();
});
于 2012-10-16T13:54:41.747 回答
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);
于 2012-10-16T13:27:06.147 回答