Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript HTTP请求后JSON输入意外结束_Javascript_Node.js - Fatal编程技术网

Javascript HTTP请求后JSON输入意外结束

Javascript HTTP请求后JSON输入意外结束,javascript,node.js,Javascript,Node.js,在这里,我发出了一个HTTPS请求,并将发送回来的JSON存储在data变量中。我已经在程序的其他地方使用了类似的函数,在那里它按预期工作。然而,这次我在useJSON.parse(data)行上得到了一个SyntaxError:JSON输入的意外结束 我怀疑数据不包含从API返回的所有JSON,因为它相当大。我是否需要更改从HTTPS请求捕获输入的方式,以防它不是一次性捕获到数据中,或者这里是否存在其他问题 让我的问题成为代码而不是API的唯一原因是,当在第三方HTTP客户端上发出请求时,我得

在这里,我发出了一个HTTPS请求,并将发送回来的JSON存储在
data
变量中。我已经在程序的其他地方使用了类似的函数,在那里它按预期工作。然而,这次我在use
JSON.parse(data)
行上得到了一个
SyntaxError:JSON输入的意外结束

我怀疑
数据
不包含从API返回的所有JSON,因为它相当大。我是否需要更改从HTTPS请求捕获输入的方式,以防它不是一次性捕获到
数据中,或者这里是否存在其他问题

让我的问题成为代码而不是API的唯一原因是,当在第三方HTTP客户端上发出请求时,我得到了所有预期的JSON

函数isStreamLive(channelID,回调){
isLive=假;
常量选项StreamInfo={
“主机名”:“api.twitch.tv”,
“路径”:“/kraken/streams/”+channelID,
“标题”:{
'客户ID':'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
“接受”:“application/vnd.twitchtv.v5+json”
}
}
const request=https.get(选项StreamInfo,(结果)=>{
result.on('数据',(数据)=>{
log(JSON.parse(data));
});
});
request.end();
}
程序终止前的输出显示了JSON expect的绝大多数内容,但被截断,后面有几行空行

在不使用JSON.parse的情况下记录
数据
变量

<Buffer 7b 22 73 74 72 65 61 6d 22 3a 7b 22 5f 69 64 22 3a 33 38 31 34 30 30 37 33 38 30 38 2c 22 67 61 6d 65 22 3a 22 44 6f 74 61 20 32 22 2c 22 62 72 6f 61 ... 
1321 more bytes>
<Buffer 76 69 65 77 73 22 3a 34 38 37 38 39 31 32 2c 22 66 6f 6c 6c 6f 77 65 72 73 22 3a 39 31 30 33 39 2c 22 62 72 6f 61 64 63 61 73 74 65 72 5f 74 79 70 65 ... 
84 more bytes>

由此,我假设JSON.parse正在接收第一个缓冲区,而不是导致JSON被切断的第二个缓冲区


有没有办法同时接收这两个缓冲区?

我认为您不需要结束请求

您可以这样做:

function isStreamLive(channelID, callback) {
    isLive = false;
    const optionsStreamInfo = {
        'hostname': 'api.twitch.tv',
        'path': '/kraken/streams/' + channelID,
        'headers': {
            'Client-ID': 'xxxxxxxxxxxxxxxxxxxxxxxxxx',
            'Accept': 'application/vnd.twitchtv.v5+json'
        }
    }
    const request = https.get(optionsStreamInfo, (result) => {
        result.on('data', (data) => {
            const mergedData = Buffer.concat(data)
            console.log(JSON.parse(mergedData));
        });
    });
}
使用请求承诺,您还可以使用节点获取,这非常类似。。 const rp=要求(“要求-承诺”)


我认为你不需要结束这个请求

您可以这样做:

function isStreamLive(channelID, callback) {
    isLive = false;
    const optionsStreamInfo = {
        'hostname': 'api.twitch.tv',
        'path': '/kraken/streams/' + channelID,
        'headers': {
            'Client-ID': 'xxxxxxxxxxxxxxxxxxxxxxxxxx',
            'Accept': 'application/vnd.twitchtv.v5+json'
        }
    }
    const request = https.get(optionsStreamInfo, (result) => {
        result.on('data', (data) => {
            const mergedData = Buffer.concat(data)
            console.log(JSON.parse(mergedData));
        });
    });
}
使用请求承诺,您还可以使用节点获取,这非常类似。。 const rp=要求(“要求-承诺”)


您可以在逻辑中做些什么来让自己看到
数据的实际值是什么?为什么不在尝试解析console.log(数据)以查看响应中的内容(或者使用开发人员工具检查请求/响应)之前先查看它?不管怎样,我怀疑您是对的,服务器正在向您发送格式错误的JSON。您可以在逻辑中做些什么来允许自己查看
数据的实际值是什么?为什么不在尝试解析它之前查看console.log(data)以查看响应中的内容(或者使用开发人员工具检查请求/响应)?不管怎样,我怀疑您是对的,服务器正在向您发送格式错误的JSON。我似乎无法使用它。在这种情况下(https.get(…)。then不是一个函数)。有其他选择吗?您使用什么软件包进行请求?HTTPS。我之前尝试过使用request,但遇到了麻烦。此外,我不认为我的内存不足,因为完整JSON的大小约为2Kb。你可以注销数据而不是JSON.parse(data)?这不会导致错误,而是只显示原始十六进制,使用JSON.stringify只生成一个数字列表。它们都表明有两个缓冲区,一个比另一个大得多。所以我假设JSON.parse只是解析第一个缓冲区,留下第二个缓冲区,这导致JSON被切断。因此,我认为解决问题的方法是找出如何一次解析两个缓冲区,或者将所有JSON放在一个缓冲区中,这似乎是我无法使用的。在这种情况下(https.get(…)。then不是一个函数)。有其他选择吗?您使用什么软件包进行请求?HTTPS。我之前尝试过使用request,但遇到了麻烦。此外,我不认为我的内存不足,因为完整JSON的大小约为2Kb。你可以注销数据而不是JSON.parse(data)?这不会导致错误,而是只显示原始十六进制,使用JSON.stringify只生成一个数字列表。它们都表明有两个缓冲区,一个比另一个大得多。所以我假设JSON.parse只是解析第一个缓冲区,留下第二个缓冲区,这导致JSON被切断。因此,我认为解决问题的方法是找出如何同时解析两个缓冲区,或者将所有JSON放在一个缓冲区中