2013-06-27 3 views
0

Я сейчас нахожусь над моей головой.Node.js - блокировка вокруг асинхронного вызова. Или неблокирующий xmltojs lib

Я новичок в узле и написаю паспортный модуль для Freshbooks. Есть функция Passport, которую я пытаюсь реализовать, чтобы получить профиль пользователя.

Этот код использует OAuth foo Passport для запроса.

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

Получаю ответ. Это xml. Я конвертирую его в JSON, но на самом деле я этого не хочу. Мне нужен простой javascript-объект.

Я посмотрел https://github.com/Leonidas-from-XIV/node-xml2js, но примеры не показывают, как получить результат.

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

Что делать, чтобы блокировать этот код до завершения вызова и получить результат? Я не уверен, как объединить эти два обратных вызова вместе.

ответ

0

вы можете попросить xml2json вернуть объект:

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

, если вы решите использовать асинхронный анализатор затем просто положить done обратный вызов внутри обработчика результата JSON. Нет необходимости «блокировать» асинхронную функцию:

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); 
}); 
+0

Спасибо, Андрей! Это именно то, что мне нужно! –