response is in junked format in node.js

I am developing an API using Node.js. In my application when i hit an URL though browser i gto JSON response in my browser perfectly.. But when i get the response through my node.js code, its coming as junk.

Consider i am hitting the following url in browser:

localhost:2000/xxxxx/rrrrr/ggggg

I am receiving perfect output.

The following is the node.js code:

 proxyReq.on("response", function(proxyRes) {
            var body = ''
                try{
                    proxyRes.on("data", function(chunk) { //Capture API response here---revisit
                    body += new Buffer(chunk, 'binary').toString();
                    //console.log("cccc=" +chunk)
                    /*zlib.unzip(chunk.toString(), function(err, chunk){
                        console.log("Inside zliib");
                       if (!err){
                           console.log('Response'+chunk.toString())
                       } else {
                           console.log("Inside zlib error");
                       }
                    });*/
                       //body = chunk.toString();
                       //console.log(chunk.toString('utf-8'));

                       console.log('cccccccc=' +body);
                    });
                }catch(err){
                    console.log("errrr=" +err.stack);
                }
}

Here the 'body' is printing as some junked data. I tried for "utf-8" and "binar" nothing works. Help me to solve this. Thanks in advance.

Mu Junked Data:

Ys��ǿJ����}/c�؎}�%�ld� a�T��mIL�Z� ]�T��I�r����ߕ�h4��ϕ�7t{�Q4��8���\�L�N؛T��VWM�r ?W&Q��N&/Q����|�W9??W��t�b�n:t>:��(t��G��K��w��=��r\���_��W�N�c��{���u�ۺU���m�^���z�'�ǫ��LFQ�uc���s�>��f

I didn't install using npm:

Third party code regarding ProxyReq:

var ended, mod, proxyReq, req_options;

        if (err) {
          return _this.error(err, req, res);
        }
        mod = req.api.data.protocol === "https" ? https : http;
        req_options = _this.getHttpProxyOptions(req);
        req_options.agent || (req_options.agent = new mod.Agent({
          maxSockets: 100,
          rejectUnauthorized: req.api.data.strictSSL
        }));
        _this.logger.debug(("Backend: " + req_options.method + " to ") + ("'" + req.api.data.protocol + "://") + ("" + req_options.host + ":" + req_options.port + req_options.path));
        proxyReq = mod.request(req_options);
        proxyReq.setTimeout(req.api.data.endPointTimeout * 1000, function() {
          var e;
          e = new Error("ETIMEDOUT");
          e.code = "ETIMEDOUT";
          proxyReq.emit("error", e);
          return proxyReq.abort();
        });
        ended = false;

I found your problem. This is the documentation of event response for http/https

Emitted when a response is received to this request. This event is emitted only once. The response argument will be an instance of http.IncomingMessage.

And http.IncomingMessage is a ReadableStream.

After that, you should use this two events of stream to convert this into String :

  • Event: 'data'
  • Event: 'end'

For stream.on('data', ...) you should collect your data data into either a Buffer (if it is binary) or into a string.

For on('end', ...) you should call a callback with you completed buffer, or if you can inline it and use return using a Promises library.

Example, for you, you can change your proxyReq.on("response") callback content by this :

var Buffer = require('buffer').Buffer;

proxyReq.on("response", function(chunk) {
    //proxyRes.setEncoding ('utf8');
     var body = '';
     chunk.on('data', function(data) {
        body += new Buffer(data, 'binary').toString();
     });
     chunk.on('end', function () {
         // callback
     });
     chunk.on('error', function (err) {
         // catchable error
     });
});

To simplify you request part, I recommand you to use the node-request package : https://github.com/mikeal/request