0

mongodbからJSONを返すAPIがあります。

// In router.js
var api = require('api') 
app.get('/lists', api.lists);

// In api.js
var db = require('db')
exports.lists = function(req, res) {
  db.lists.find({}, function(err, lists) {
    res.send(lists);
  });
};

Node.jsアプリ内からも使用できるようにAPIを設計する方法はありますか?APIの外部でデータベースコードを複製する必要がないようにしています。私は基本的にデータサーバー側をレンダリングできるコントローラーを持っています:

// In controller.js
var api = require('api')
exports.page = function(req, res) {
  res.send(api.lists()); // This won't work
};

コールバック関数をapi.lists()に渡すというハッキーな解決策を見つけましたが、これはこれを実現するための「間違った」方法だと感じています。

// In api.js
exports.lists = function(req, res, callback) {
  db.lists.find({}, function(err, lists) {
    if(callback){
       callback(lists);
    } else {
       res.send(lists);
    }
  });
};

何か案は?

4

1 に答える 1

3

問題は、現在のコードで API を応答オブジェクトに結合していることだと思います。次のような方法でそれらを分離できます。

コールバックとしてapi.listsを使用する代わりに、router.js で、応答オブジェクトに接続されたコールバックで api.lists を呼び出す関数を定義します。この場合、api.list は応答オブジェクトについて知る必要はありませんが、作成している関数は必要です。

// In router.js
var api = require('api');
app.get('/lists', function(req, res) {
  api.lists(function(err, lists) {
    if(err) {
      res.send('error page');
      return;
    }
    res.send(lists);
  });
});

api.js では、応答オブジェクトへの参照を削除します。これで、受信したコールバックを適切なデータ (err + リスト) と共に呼び出すだけになります。結果をどう処理するかは、コールバック次第です。

// In api.js
var db = require('db')
exports.lists = function(callback) {
  db.lists.find({}, function(err, lists) {
    callback(err, lists);
  });
};
于 2013-02-27T14:24:37.070 に答える