首页 > 解决方案 > Node.js - https.get() 和 JSON.parse() 使服务器崩溃

问题描述

我已经上传了一个测试应用程序。

不幸的是,服务器崩溃了。

这是导致服​​务器崩溃的代码片段:

https.get(`https://www.instagram.com/${username}/?__a=1`, resp => {
            resp.on('data', chunk => data.push(chunk));
            resp.on('end', () => {
                var json = JSON.parse(data.join(''));
                done(json.graphql.user);
            });
        });

这是错误消息:

SyntaxError: Unexpected end of JSON input at JSON.parse (<anonymous>)
 at IncomingMessage.resp.on (/app/app/routes.js:108:33)
 at IncomingMessage.emit (events.js:203:15)
 at endReadableNT (_stream_readable.js:1145:12)
 at process._tickCallback (internal/process/next_tick.js:63:19)
State changed from up to crashed.

代码崩溃了,JSON.parse()但我认为该行存在一些错误https.get()。不幸的是,我不明白出了什么问题,我正在研究这个问题好几天。

编辑:更奇怪的是,有时这段代码可以正常工作,有时它会使服务器崩溃。我的意思是对于特定的用户名它可以工作,但对于同一个用户名它又不能。

标签: javascriptnode.jsjson

解决方案


据我所知,这是由于过多地执行这些请求造成的。您可以通过简单地检查它是否是有效的响应data.join("") === ""- 适用于所有内容,除了无效用户 - 为此,您可以检查是否data.join("").startsWith("<!DOCTYPE html>")

这是因为当您被限制时,响应只是空的,而当用户无效时,它是以网站的 HTML 内容开头,<!DOCTYPE html>这使我们可以轻松地检查它。

检查数据是否有效

if(data.join("") === "" || data.join("").startsWith("<!DOCTYPE html>")) {
    console.log("Invalid data!")
}

检查它是否是无效用户或您是否受到限制

if(data.join("") === "") {
    // throttled
} else if(data.join("").startsWith("<!DOCTYPE html>")) {
    // invalid user
} else {
    // valid data and user
}

几乎完整的代码

https.get(`https://www.instagram.com/${username}/?__a=1`, resp => {
    let data = [];
    resp.on('data', chunk => data.push(chunk));

    resp.on('end', () => {

        if(data.join("") === "") {
            // You are being throttled - handle it
        } else if(data.join("").startsWith("<!DOCTYPE html>")) {
            // The user is invalid - handle it
        } else {
            // Everything is OK
            const json = JSON.parse(data.join(''));
            done(json.graphql.user);
        }
    });
});

推荐阅读