我最近开始学习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);
这样做可以吗?
我想确保我不会多次创建数据库连接,并且共享变量是我能想到的唯一方式......
你能提出任何建议吗?
谢谢!
答案 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);