Express.js代理管道将XML转换为JSON

时间:2015-04-23 06:52:56

标签: javascript xml json express proxy

对于我的前端(角度)应用,我需要连接到不支持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);

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

所以基本上我正在寻找创建XML到JSON代理作为现有API之上的层。

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

1 个答案:

答案 0 :(得分: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);