SyntaxError:意外的标记u或[SyntaxError:意外的输入结束]

时间:2017-02-07 09:46:06

标签: javascript json node.js promise

这是我使用承诺的代码

    var http = require("http");    
        function webFunc(req, res){
            var p = getData();
            p.then(function(data) {
                // var jsonData = JSON.parse(data);
                // console.log(JSON.parse(data))
                res.send(JSON.parse(data)); 
            }).catch(function(err) {
                console.log(err);
            })
        }
        function getData(){
            var prom=new Promise (function(resolve,reject){
            http.get(url,function(res) {
                    var data = "";
                    res.on("data", function(chunk) {
                        data += chunk;
                        resolve(data);
                        return;
                    })
                    res.on("error", function(error) {
                        console.log("Got error: " + error.message);
                        reject(error);
                    });
                });
            })
            return prom;
        }

当我在没有像这样设置JSON.parse的情况下运行路线时

 res.send(data); 

我每次运行时都获得了一半的数据或所有数据    如果我像这样设置JSON.parse

 res.send(JSON.parse(data)); 

我收到了这个错误

 [SyntaxError: Unexpected token u]
    or this 
     [SyntaxError: Unexpected end of input]

数据结果应该包含8个这样的信息对象 我做了这个命令

    console.log(data)
    console.log("typeof data",typeof data)
   i got this 
{"days":{"location":{"id":11,"name":"city","resultinfo":{"info":[{"d":"2017-02-07","tt":15,"ss":"39"
    typeof data string

我如何解决这个问题

2 个答案:

答案 0 :(得分:3)

您过早使用这些数据。请参阅the documenation of http.get中的示例:

let rawData = '';
res.on('data', (chunk) => rawData += chunk);
res.on('end', () => {
  try {
    let parsedData = JSON.parse(rawData);
    console.log(parsedData);
  } catch (e) {
    console.log(e.message);
  }
});

您想要使用end事件的数据,而不是data事件。如果从第一个data事件开始解析项目,则您只处理数据的部分

所以(注意***行):

function getData() {
    var prom = new Promise(function(resolve, reject) {
        http.get(url, function(res) {
            var data = "";
            res.setEncoding('utf8');              // See note below
            res.on("data", function(chunk) {      // ***
                data += chunk;                    // ***
            })                                    // ***
            res.on("end", function() {            // ***
                resolve(data);                    // ***
            });                                   // ***
            res.on("error", function(error) {
                console.log("Got error: " + error.message);
                reject(error);
            });
        });
    })
    return prom;
}

作为Ryan points out,您需要

res.setEncoding('utf8');
如果你想把数据块作为字符串而不是Buffers那么

重新编辑:

  

数据结果应该包含8个这样的信息对象

您引用的数据不是JSON。在JSON中,属性名称必须是双引号。要成为JSON,它必须如下所示:

{
    "first-days": {
        "location": {
            "id": 11,
            "loc": "city",
            "info": {
            }
        }
    }
}

我已经遗漏了你的例子中没有任何意义的东西,但你得到了要点。更多on JSON.org

您的后续编辑显示真实的东西;我们可以看到它看起来像有效的JSON。

答案 1 :(得分:1)

var data = "";
res.on("data", function(chunk) {
    data += chunk;
    resolve(data);
    return;
})

这是不对的。如果没有在流上设置编码,则默认情况下块应该是缓冲区,并且在第一个块之后不应解析。

var parts = [];

res.on("data", function (chunk) {
    parts.push(chunk);
});

res.on("end", function () {
    resolve(Buffer.concat(parts).toString("utf8"));
});