2

私は最近node.js+Expressを学び始め、それが非常に興味深いことに気づきました。

ルーティングでの変数の共有に関する多くの投稿を読みましたが、それらの多くはmodule.exportsとexportsを使用していました。

ローカル変数を設定する関数を作ることにしました

ルート/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);

このようなことをしても大丈夫ですか?

私はdb接続を2回以上行わないようにしたいので、変数を共有することが私が考えることができる唯一の方法でした...

何か提案はありますか?

ありがとうございました!!

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.exportsexports

また、名前の競合を防ぎ、一度宣言するために、モジュールコードを自己実行無名関数にカプセル化します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 に答える