2013-02-27 2 views
0

J'ai une API qui retourne une JSON de MongoDB:Comment puis-je concevoir mon API Node.js pour que je puisse également la consommer du côté serveur?

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

Est-il possible de concevoir l'API pour que je puisse aussi consommer de l'intérieur de mon application Node.js? J'essaie d'éviter d'avoir à dupliquer le code de la base de données en dehors de l'API. J'ai essentiellement un contrôleur qui peut rendre le côté serveur de données:

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

J'ai trouvé une solution hacky qui devait passer une fonction de rappel aux api.lists(), mais j'ai le sentiment est le " mauvais "moyen d'atteindre ceci:

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

Des idées?

+0

Vous voulez consommer votre propre api? Jamais entendu ça avant. Peut-être que vous voulez utiliser des modèles que vous pouvez utiliser dans deux endroits différents ... se pencher sur express. – chovy

+0

Cela ressemble beaucoup à la découverte wsdl/webservice, c'est-à-dire que vous pouvez créer automatiquement des méthodes/propriétés en fonction des appels API que vous exposez. Si c'est le cas, bonne chance, il y a eu quelques tentatives pour standardiser ce que rien n'a bloqué jusqu'à présent. – booyaa

Répondre

3

Je pense que le problème est que dans votre code actuel, vous associez votre API à l'objet de réponse. Vous pouvez les découpler avec quelque chose comme ceci:

En router.js au lieu d'utiliser api.lists comme le rappel, définir une fonction qui appellera api.lists avec un rappel qui est câblé à l'objet de réponse. Dans ce cas, api.list n'a pas besoin de connaître l'objet de réponse mais la fonction que nous créons.

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

En api.js nous supprimer la référence à l'objet de réponse. Maintenant, il appellera simplement n'importe quel rappel qu'il a reçu avec les données appropriées (err + listes). C'est à l'appel de faire ce qu'il veut avec le résultat.

// In api.js 
var db = require('db') 
exports.lists = function(callback) { 
    db.lists.find({}, function(err, lists) { 
    callback(err, lists); 
    }); 
}; 
Questions connexes