Node.js - howto block around async call. Or non-blocking xmltojs lib

I'm over my head at the moment.

I'm new to node and writing a passportjs module for Freshbooks. There's a Passport function I'm trying to implement that get's a user's profile.

This code uses Passport's OAuth foo to make a request.

  this._oauth.post(url, token, tokenSecret, post_body, post_content_type, function (err, body, res) {
    if (err) { return done(new InternalOAuthError('failed to fetch user profile', err)); }

    try {
      var parser = require('xml2json');
      var json = parser.toJson(body); //returns a string containing the JSON structure by default

      var util = require('util');
      console.log(util.inspect(json));

      var profile = { provider: 'freshbooks' };

      profile.id = json.response.staff.staff_id;
      profile.displayName = json.response.staff.first_name + ' ' + json.response.staff.last_name;
      profile.name = { familyName: json.response.staff.last_name,
                       givenName: json.response.staff.first_name };
      if (json.response.staff.email) { profile.emails = [{ value: json.response.staff.email }]; }
      profile._raw = body;
      profile._json = json;
      console.log(util.inspect(json));


      done(null, profile);
    } catch(e) {
      done(e);
    }
  });

I get a response. It's xml. I'm converting it to JSON, but I don't want that actually. I want a plain-old javascript object.

I looked at https://github.com/Leonidas-from-XIV/node-xml2js but the examples don't show how to get the result out.

var parseString = require('xml2js').parseString;
var xml = "<root>Hello xml2js!</root>"
parseString(xml, function (err, result) {
    console.dir(result);
});

What do I do to block around this code till the call is complete and get result out? I'm not sure how to merge these two callbacks together.

you can ask xml2json to return object:

var json = parser.toJson(body, {object: true});

if you decide to use async parser then just put your done callback inside json result handler. There is no need to "block" async function:

var parseString = require('xml2js').parseString;
parseString(body, function(err, json) {
   // handle error: return done(err)
   // do your logic if no error
   // ...
   // profile._json = json;
   // ...
   //
   // 'return' result
   done(null,  profile);
});