这是我使用承诺的代码
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
我如何解决这个问题
答案 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"));
});