Я сейчас нахожусь над моей головой.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);
});
Что делать, чтобы блокировать этот код до завершения вызова и получить результат? Я не уверен, как объединить эти два обратных вызова вместе.
Спасибо, Андрей! Это именно то, что мне нужно! –