最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Node.js undefined:1 [SyntaxError: Unexpected end of input] - Stack Overflow

programmeradmin1浏览0评论

I am getting the following error when I execute the node.js script, I tried to investigate a lot by adding console.log() to trace the error but could not find any solution. [Note: I have also searched other Stackoverflow solution but none of it helped]

undefined:1
   {"ydht":{"status":{"code":200,"message":"OK"},"records":[
                                                     ^
SyntaxError: Unexpected end of input
at Object.parse (native)
at IncomingMessage.<anonymous> (/tmp/subs_20140130/inc/getData.js:36:24)
at IncomingMessage.EventEmitter.emit (events.js:95:17)
at IncomingMessage.<anonymous> (_stream_readable.js:745:14)
at IncomingMessage.EventEmitter.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:407:10)
at emitReadable (_stream_readable.js:403:5)
at readableAddChunk (_stream_readable.js:165:9)
at IncomingMessage.Readable.push (_stream_readable.js:127:10)
at HTTPParser.parserOnBody [as onBody] (http.js:142:22)

Here is my code:

var options = {
  host: '<my host>',
  port: 3128,
  path: 'http://<some host>:4080'+searchQuery,
  method: 'GET',
  headers: {
     'App-Auth': cert
  }
};
var req = http.request(options, function(res) {   
  res.setEncoding('utf8'); //DEBUG
  for ( var k in options) { console.log("[LOGGING] options :" + k + " = " + options[k]);} //DEBUG
  res.on('data', function (resData) {
    var resObj = "";
    resObj =  JSON.parse(resData);
    console.log("[LOGGING] Response:: "+resObj);               
    if(resObj.ydht.status.code === 200 && resObj.ydht.records[0].key.length > 0) {
      console.log("[LOGGING] Email   "+em+"  Key       "+resObj.ydht.records[0].key);          
      var filePath = basePath + '/setData';
      var setd = require(filePath);
      setd.setMagData(resObj.ydht.records[0].key, ycacert, is_sub);
    } else {
      console.log("[LOGGING] Fail to fetch data em        "+em+"  nl      "+nl);
    }
  });
  res.on('end', function() {
    console.log("[LOGGING] connection closed");
  });
});
req.on('error', function(err) {
  console.log("[LOGGING] Fail to fetch data em        "+em+"  nl      "+nl);
});
req.end();

When I call the api using curl command, I get the below valid json response:

{"ydht":{"status":{"code":200,"message":"OK"},"records":[{"metadata":{"seq_id":"intusnw1-14B3579A577-3","modtime":1422531339,"disk_size":99},"key":"[email protected]","fields":{"em":{"value":"[email protected]"},"is_confirm":{"value":""},"nl":{"value":"offerpop1"}}}],"continuation":{"scan_completed":false,"scan_status":200,"uri_path":"/YDHTWebService/V1/ordered_scan/dts.subs_email?order=asc&start_key=a0"}}}

I am getting the following error when I execute the node.js script, I tried to investigate a lot by adding console.log() to trace the error but could not find any solution. [Note: I have also searched other Stackoverflow solution but none of it helped]

undefined:1
   {"ydht":{"status":{"code":200,"message":"OK"},"records":[
                                                     ^
SyntaxError: Unexpected end of input
at Object.parse (native)
at IncomingMessage.<anonymous> (/tmp/subs_20140130/inc/getData.js:36:24)
at IncomingMessage.EventEmitter.emit (events.js:95:17)
at IncomingMessage.<anonymous> (_stream_readable.js:745:14)
at IncomingMessage.EventEmitter.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:407:10)
at emitReadable (_stream_readable.js:403:5)
at readableAddChunk (_stream_readable.js:165:9)
at IncomingMessage.Readable.push (_stream_readable.js:127:10)
at HTTPParser.parserOnBody [as onBody] (http.js:142:22)

Here is my code:

var options = {
  host: '<my host>',
  port: 3128,
  path: 'http://<some host>:4080'+searchQuery,
  method: 'GET',
  headers: {
     'App-Auth': cert
  }
};
var req = http.request(options, function(res) {   
  res.setEncoding('utf8'); //DEBUG
  for ( var k in options) { console.log("[LOGGING] options :" + k + " = " + options[k]);} //DEBUG
  res.on('data', function (resData) {
    var resObj = "";
    resObj =  JSON.parse(resData);
    console.log("[LOGGING] Response:: "+resObj);               
    if(resObj.ydht.status.code === 200 && resObj.ydht.records[0].key.length > 0) {
      console.log("[LOGGING] Email   "+em+"  Key       "+resObj.ydht.records[0].key);          
      var filePath = basePath + '/setData';
      var setd = require(filePath);
      setd.setMagData(resObj.ydht.records[0].key, ycacert, is_sub);
    } else {
      console.log("[LOGGING] Fail to fetch data em        "+em+"  nl      "+nl);
    }
  });
  res.on('end', function() {
    console.log("[LOGGING] connection closed");
  });
});
req.on('error', function(err) {
  console.log("[LOGGING] Fail to fetch data em        "+em+"  nl      "+nl);
});
req.end();

When I call the api using curl command, I get the below valid json response:

{"ydht":{"status":{"code":200,"message":"OK"},"records":[{"metadata":{"seq_id":"intusnw1-14B3579A577-3","modtime":1422531339,"disk_size":99},"key":"[email protected]","fields":{"em":{"value":"[email protected]"},"is_confirm":{"value":""},"nl":{"value":"offerpop1"}}}],"continuation":{"scan_completed":false,"scan_status":200,"uri_path":"/YDHTWebService/V1/ordered_scan/dts.subs_email?order=asc&start_key=a0"}}}
Share Improve this question edited Jan 30, 2015 at 10:30 Mahavir Munot asked Jan 30, 2015 at 10:10 Mahavir MunotMahavir Munot 1,4642 gold badges22 silver badges47 bronze badges
Add a comment  | 

3 Answers 3

Reset to default 16

The data callback is called multiple times with chunks of the response. On each callback you need to append the response to a string and then on end, that's when you parse it.

var req = http.request(options, function(res) {
    res.setEncoding('utf8');
    var body = "";
    res.on('data', function(resData) {
        body += resData;
    });
    res.on('end', function() {
        var json = JSON.parse(body);
        if (json.ydht.status.code === 200 && json.ydht.records[0].key.length > 0) {
            var filePath = basePath + '/setData';
            var setd = require(filePath);
            setd.setMagData(json.ydht.records[0].key, ycacert, is_sub);
        } else {
            console.log("[LOGGING] Fail to fetch data em        " + em + "  nl      " + nl);
        }
    });
});

For me when I get this error:

undefined:1
[

It's because the .json file is saved as:

8-bit unicode BOM, Win (CRLF) instead of: 8-bit unicode, Win (CRLF)

it needs to be the later for me!

LATE

First of all Thank you Ben for the correct root cause analysis. I have tried the solution Ben proposed, but since my response data was so huge, it started giving me "socket hang up" error. So I have to redesign the solution using node.js request module

//Load the request module ( Dont forget to include it in package.json dependency "request": "2.x.x")
var request = require('request');

request('http://xys.com/api', function (error, response, body) {
    //Check for error
    if(error){
        return console.log('Error:', error);
    }

    //Check for right status code
    if(response.statusCode !== 200){
        return console.log('Invalid Status Code Returned:', response.statusCode);
    }

    console.log(body); // Here is the response body

});
发布评论

评论列表(0)

  1. 暂无评论