【问题标题】:Node.js - howto block around async call. Or non-blocking xmltojs libNode.js - 如何阻止异步调用。或非阻塞 xmltojs lib
【发布时间】:2013-06-24 10:42:06
【问题描述】:

我现在有点不知所措。

我是 node 新手,正在为 Freshbooks 编写一个 passportjs 模块。我正在尝试实现一个 Passport 函数来获取用户的个人资料。

此代码使用 Passport 的 OAuth foo 发出请求。

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

在调用完成并得到结果之前,我该怎么做才能阻止这段代码?我不确定如何将这两个回调合并在一起。

【问题讨论】:

    标签: javascript xml json node.js passport.js


    【解决方案1】:

    你可以要求 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);
    });
    

    【讨论】:

    • 谢谢安德鲁!这正是我所需要的!
    猜你喜欢
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 2012-05-21
    相关资源
    最近更新 更多