【问题标题】:Express.js proxy pipe translate XML to JSONExpress.js 代理管道将 XML 转换为 JSON
【发布时间】:2015-04-23 06:52:55
【问题描述】:

对于我的前端(角度)应用,我需要连接到不支持 CORS 的外部 API。

所以我解决这个问题的方法是在 Node.JS / Express.JS 中有一个简单的代理来传递请求。额外的好处是我可以在代理级别设置我的 api-credentials,而不必将它们传递到用户可能窃取/滥用它们的前端。

这一切都很完美。

这是代码,供记录:

var request = require('request');
var config = require('./config');

var url   = config.api.endpoint;
var uname = config.api.uname;
var pword = config.api.pword;
var headers = {
    "Authorization" : 'Basic ' + new Buffer(uname + ':' + pword).toString('base64'),
    "Accept" : "application/json"
};

exports.get = function(req, res) {
  var api_url = url+req.url;
  var r = request({url: api_url, headers: headers});
  req.pipe(r).pipe(res);
};

我必须使用的 API 端点只有 XML 作为输出格式。所以我在前端使用 xml2js 将 XML 响应转换为 JSON。

这也很好用,但我想减轻客户端的负载,并在服务器上执行 XML -> JSON 解析步骤。

我想我将不得不创建类似的东西:

req.pipe(r).pipe(<convert_xml_to_json>).pipe(res);

但我不知道如何创建这样的东西。

所以基本上我希望在现有 API 之上创建一个 XML 到 JSON 代理作为层。

关于“如何制作代理”和“如何将 XML 转换为 JSON”有很多关于 SO 的问题,但我找不到将两者结合起来的任何问题。

【问题讨论】:

    标签: javascript xml json express proxy


    【解决方案1】:

    您需要使用transform stream,对于 xml 到 json 的转换,您需要一些库,我使用这个 xml2json

    ..然后你像这样使用它(简化但它也应该与请求一起使用)

    var http = require('http');
    var fs = require('fs');
    var parser = require('xml2json');
    var Transform = require('stream').Transform;
    
    
    function xmlParser () {
      var transform = new Transform();
      transform._transform = function(chunk, encoding, done) {
        chunk = parser.toJson(chunk.toString())
        console.log(chunk);
        this.push(chunk);
        done();
      };
    
      transform.on('error', function (err) {
        console.log(err);
      });
    
      return transform;
    }
    
    var server = http.createServer(function (req, res) {
      var stream = fs.createReadStream(__dirname + '/data.xml');
      stream.pipe(xmlParser()).pipe(res);
    });
    server.listen(8000);
    

    【讨论】:

    • 谢谢!这行得通。在让它工作时遇到了一些麻烦,但后来我意识到我使用的是 xml2js 而不是 xml2json。切换后,一切正常。
    • 写得很好的答案.. 太好了。!!
    猜你喜欢
    • 2020-05-30
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    相关资源
    最近更新 更多