[英]Node.js - https.get() and JSON.parse() crash the server
我已經上傳了一個測試應用程序。
不幸的是,服務器崩潰了。
這是導致服務器崩潰的代碼片段:
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>")
這是因為當您被限制時,響應只是空的,而當用戶無效時,它是一個以<!DOCTYPE html>
開頭的網站的 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);
}
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.