我在 nodejs 和 php 上編寫了一個腳本,它實現(xiàn)了相同的功能:ping API、檢索文件列表、循環(huán)遍歷每個文件并將它們下載到磁盤上的指定位置。左邊是nodejs,右邊是php。我觀察到,在 Nodejs 中每次嘗試時,某些文件都會隨機失敗。經(jīng)過某種嘗試后,所有文件也會成功。在 php 上,每次嘗試都是一致的,并且所有文件都可以正常下載。Nodejs 中是否缺少某些內(nèi)容,即默認情況下通過下載文件的請求未包含配置/標頭?或者下載多個文件需要在nodejs中以不同的方式處理嗎?Nodejs代碼:const http = require('https');const fs = require('fs');function getResponse(url, callback) { http.get(url, response => { let body = ''; response.on('data', data => { body += data }) response.on('end', () => { callback(JSON.parse(body)) }) })}var download = function (url, dest, callback) { http.get(url, response => { response.on('error', function (err) { console.log(err) }) .pipe(fs.createWriteStream(dest)) .on('close', callback) });};getResponse('https://wallhaven.cc/api/v1/search?page=1', json => { json.data.forEach((item, index) => { download(item.path, `files/file-${index}.jpg`, function () { console.log('Finished Downloading' + `file-${index}.jpg`) }); })})PHP代碼 $client = new \GuzzleHttp\Client(); $response = $client->get('https://wallhaven.cc/api/v1/search?page=1'); $json = json_decode((string)$response->getBody()); $rows = $json->data; foreach ($rows as $index => $row) { $content = file_get_contents($row->path); Storage::put("files/file-$index.jpg", $content); } return 'done';
1 回答

慕無忌1623718
TA貢獻1744條經(jīng)驗 獲得超4個贊
沒有任何神奇的標頭可以讓它在 Node.js 中工作。如果有時有效,而有時請求花費的時間太長,則服務器可能會由于速率限制而默默地丟棄請求。
我可以看出 PHP 是同步的,它將每個文件一個接一個地下載到內(nèi)存中,然后放入一個文件中,而在 Node.js 中,您可以立即觸發(fā)每個請求并立即處理所有請求,將內(nèi)容流式傳輸?shù)轿募小=邮盏絹y序數(shù)據(jù)包是正常的,TCP 協(xié)議可確保它們重新組合在一起。Node.js 能夠執(zhí)行類似的操作,您很可能會遇到服務器的安全功能或其他限制。
如果時間不是問題,我建議修改 Node.js 來減慢請求速度,可以通過限制并發(fā)請求的數(shù)量,也可以逐個執(zhí)行(最簡單的選項,請參閱 、promise、axios 庫)async/await
。繼您的 Reddit 帖子之后,學習 C++ 來完成這項任務很可能不會產(chǎn)生任何好處。事實上,這會困難幾個數(shù)量級。Node.js 是一個非常強大的平臺,其功能遠不止下載文件。
在不知道問題的真正原因的情況下,除了嘗試分析您的請求并了解它們哪里出了問題之外,我無法提供更多建議。
- 1 回答
- 0 關注
- 120 瀏覽
添加回答
舉報
0/150
提交
取消