javascript - 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()
。不幸的是,我不明白出了什么问题,我正在研究这个问题好几天。
编辑:更奇怪的是,有时这段代码可以正常工作,有时它会使服务器崩溃。我的意思是对于特定的用户名它可以工作,但对于同一个用户名它又不能。
解决方案
据我所知,这是由于过多地执行这些请求造成的。您可以通过简单地检查它是否是有效的响应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);
}
});
});
推荐阅读
- c++ - 在Linux机器上使用cmake Qt5 Webkit进行C ++交叉编译,使用mingw针对Windows,失败
- oracle - 如何在 oracle 云应用程序上创建帐户?
- javascript - 关闭模式后如何保存复选框选中状态?
- php - php文件有什么问题?Wordpress/Woocommerce 中的致命错误
- javascript - 通过单击更改 JointJS 单元格的标签并输入新标签
- php - 关闭 PHP 连接但保持文件运行
- python - 预期的字符串或字节对象,Tensorflow
- bitcoind - 当我运行 bitcoind 时,它不会生成日志
- reactjs - 怎么放
- swift - 之间的区别?和!,内存管理