0

Express でルートを次のように設定しました。

app.get('/api/:type/:id', api.getItemById);

関数 api.getItemById は、ルートの api モジュール内にあります。しかし、API モジュール内では、データベースに接続する関数を実行し、すべてのレスポンダー関数を次のように定義する必要があります。

couchbase.connect(dbConfiguration, function (err, bucket) {
  if (err) {
    throw (err)
  }

  exports.getItemById = function (req, res) {
    if (req.params.type == 'tag' || req.params.type == 'user' || req.params.type == 'asset' || req.params.type == 'expense' || req.params.type == 'income') {
      get(req, res, req.params.type);
    } else {
      res.send(400);
    }
  };

});

問題は、この場合、アプリケーションが getItemById 関数を見つけられず、これをスローすることです。

.get() requires callback functions but got a [object Undefined]

私はそれを正しく行うかどうかわかりません。コールバック関数内で定義されている場合、その関数をノード アプリに表示する方法を教えてください。

4

2 に答える 2

1

要するに、できません。は同期的であり、(モジュールがロードされた時点で) 同期的に設定さrequireれることを期待しています。[module.]exports

モジュールスコープの変数を使用できます。これは、最初はfalseでありtrue、データベースがセットアップされると に設定されます。ルート ハンドラーはそれを確認できます。

var ready = false;

// connect to database
couchbase.connect(dbConfiguration, function (err, bucket) {
  if (err) {
    throw (err)
  }
  ready = true;
};

// export your route handler
exports.getItemById = function (req, res) {
  // check for readiness
  if (! ready)
    return res.send(500); // 'Internal Server Error', or any error you like

  // if ready, perform the regular action
  if (req.params.type == 'tag' || req.params.type == 'user' || req.params.type == 'asset' || req.params.type == 'expense' || req.params.type == 'income') {
    get(req, res, req.params.type);
  } else {
    res.send(400);
  }
};

このような設定 (データベースが接続される前にリクエストが処理される) が望ましくない場合は、app.listen(...)すべての非同期起動アクションが完了するまで、サーバー (または同等のもの) の起動を延期する必要があります。ただし、それにはもう少し努力が必要です。

于 2013-05-20T19:14:41.610 に答える
0

エクスポートできませんgetItemById。データベースがセットアップされるたびに、コールバックで関数を渡す初期化関数をエクスポートする必要があります。

exports.init = function(callback) {
    couchbase.connect(dbConfiguration, function (err, bucket) {
      if (err) {
        throw (err)
      }

      var getItemById = function (req, res) {
        if (req.params.type == 'tag' || req.params.type == 'user' || req.params.type == 'asset' || req.params.type == 'expense' || req.params.type == 'income') {
          get(req, res, req.params.type);
        } else {
          res.send(400);
        }
      };

      callback(getItemById);
    });
}

そして、あなたのrequireように実行してください:

require("api").init(function(getItemById) {
    // set up express...

   app.get('/api/:type/:id', getItemById);

   // ...
});
于 2013-05-20T20:11:28.453 に答える