ExpressJS - contact external API

Here is the thing : I have a client which sends data to a server. This server has to contact an external A.P.I. and send back its response to the client. I just can't figure out how and where I can contact the external A.P.I once the server has got the client data.

I route client data like this :

app.post('/getAutoComplete', routes.read);

routes.read retrieves the data within req.body. With my nodejs version (without express framework), I then request the api this way :

var http = require('http'), options = {
        host : "192.168.1.38",
        port : 8080,
        path : "/myURL",
        method : 'POST'
};

var webservice_data = "";

var webservice_request = http.request(options, function(webservice_response)
{
    webservice_response.on('error', function(e){ console.log(e.message); });
    webservice_response.on('data', function(chunk){ webservice_data += chunk;});
    webservice_response.on('end', function(){res.send(webservice_data);});
});

webservice_request.write(req.body);
webservice_request.end();

The problem is that i'd like to use native expressJS method like app.post but I don't know how because :

  1. Express (app) object is not available here (declared in app.js but not in the route file)
  2. I don't know how to send POST data with app.post

Any suggestion ?

app.post('/getAutoComplete', routes.read);
// assuming routes.read lookes something like this
routes.read = function read(req, res) {
  var http = require('http'), options = {
          host : "192.168.1.38",
          port : 8080,
          path : "/myURL",
          method : 'POST'
  };

  var webservice_data = "";

  var webservice_request = http.request(options, function(webservice_response)
  {
      webservice_response.on('error', function(e){ console.log(e.message); });
      webservice_response.on('data', function(chunk){ webservice_data += chunk;});
      webservice_response.on('end', function(){res.send(webservice_data);});
  });

  webservice_request.write(req.body);
  webservice_request.end();
};

Also check out https://github.com/mikeal/request It's the de-facto module for doing web requests in node.

routes.read is a function. You can call it with extra parameters, so for example

app.post('/getAutoComplete', function(req,res) {
    var q = req.query.q;  // or whatever data you need
    routes.read(q, function(err, response) {
        if (err) throw err;
        return res.json(response);
    });
});

Now make the routes.read function use the first parameter as the query and when it's gathered the response from the remote API, call the second parameter with any error as the first parameter and the response as the second one.

Update This answer has already been picked as an answer, but it'd be more helpful if I showed an example of routes.read, too:

routes.read = function(q, cb) {
    // pretend we calculate the result
    var result = q * 10;
    if (result > 100) {
        // call the callback with error set
        return cb("q value too high");
    }
    // all is well, use setTimeout to demonstrate
    // an asynchronous return
    setTimeout(function() { cb(null, result) }, 2000);
};