creating a dynamically restful api for node.js

I'm using mongodb for pretty much everything in my node.js application, and now i want create a restful application, so, i did that:

I'm trying to do just the get method, for now:

restApi.js:

var restAPI = {

  get: function(method, model, sort, limit, options) {
    if (method !== 'get') {
      return;
    }

    model.find(options).sort(sort).limit(3).exec(function (error, result) {
      if (error) {
        return error;
      } else {
        return result;
      }
    });

  },
};

And now i can require this in my route:

var restApi = require('restApi');

and use like this:

app.get('/', function(req, res, next) {
  var result = restAPI.get('get', Event, 'date', 3, {'isActive': true});

  res.render('/', {
    result: result
  });
});

Is not working, the result is undefined. Why??

How can i transform this in a async function with callback? This is possible?

Thanks! :)

You're not returning anything from restApi.get. If you're using mongoose, you could return a Promise easily enough:

var restAPI = {

  get: function(method, model, sort, limit, options) {
    if (method !== 'get') {
      return;
    }

    return model.find(options).sort(sort).limit(3).exec();
  },
};

Then you can use it like this:

app.get('/', function(req, res, next) {

  restAPI.get('get', Event, 'date', 3, {'isActive': true}).then( function ( result ) {

    res.render('/', {
      result: result
    });
  }).catch( error ) {

    // Render error page and log error      

  });

});

It is because your model is async. You have to pass callbacks.

Using async way is better because it is not blocking your application while waiting for response.

Example on your case:

restApi.js:

var restAPI = {

  get: function(method, model, sort, limit, options, cb) {
    if (method !== 'get') {
      return cb("Method must be GET");
    }

    model.find(options).sort(sort).limit(3).exec(function (error, result) {
      if (error) {
        return cb(error);
      } else {
        return cb(null, result);
      }
    });

  },
};

And now i can require this in my route:

var restApi = require('restApi');

and use like this:

app.get('/', function(req, res, next) {

  restAPI.get('get', Event, 'date', 3, {'isActive': true}, function(err, result){

      if(err)
        return res.render("Error:" + err)

      res.render('/', {
        result: result
      });

  });

});

I've added cb argument to your REST API function so it is called when model async operation is done.

Router handler passes it's callback and prints output when operation is finished.