エラー:TCPConnectWrap.afterConnect [as oncomplete]でETIMEDOUTを接続する
2022-02-27 20:38:53
先日、nodeのリクエストモジュールを使ってパイプラインで画像をダウンロードしたところ、合計で561のリンクになりました。結局、毎回330以上で以下のようなエラーが報告されました。
該当するコードは以下の通りです。
import request from 'request'
import fs from 'fs'
import {jdbc as JDBC} from '. /mysql'
import {config} from ". /config";
const path = '. /images';
const jdbc = new JDBC(config.db);
let count = 0;
let empty = 0;
if(fs.existsSync(path)){
let files = fs.readdirSync(path);
if(files.length){
console.log('file residue detected');
files.forEach(file => {
fs.unlinkSync(path + '/' +file)
});
console.log('Purge successful')
}
}
jdbc.select('select origin_img_url,drugId from druglist').then( result => {
result.forEach(item => {
let url = item['origin_img_url'];
let name = item['drugId'];
if(url === ''){
empty ++;
return
}
const downloadStream = request(url);
downloadStream.pipe(fs.createWriteStream(`${path}/${name}.png`).on('close', ()=> {
console.log(`${formatTime(new Date())} has downloaded ${++count} images ${empty ? " [skip" + empty + "bar invalid data]" : ''} total ${result.length} bar data`);
}));
})
});
function formatTime(date){
return `${date.getFullYear()}-${(date.getMonth()+1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ${date. getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, ' 0')}`
}
長いこと情報収集とデバッグをした結果、リクエストタイムアウト送信時のリクエストモジュールであることがわかりました...。
エラーリスナーを追加し、再リクエストする
download.on('error', err => {
console.error(`ERROR: Error downloading image ${name} ready to retry`, JSON.stringify(err));
if(err.code === 'ETIMEDOUT'){
request(url).pipe(fs.createWriteStream(`${path}/${name}.png`).on('close', ()=> {
if(count + error +1 === result.length - empty){
console.log('Download completed!')
}else{
console.log(`${formatTime(new Date())} Redownload ${name} Success Downloaded successfully ${count + ++error}`);
}
}));
}
});
参考記事
https://github.com/request/request#requestoptions-callback
https://stackoverflow.com/questions/23632914/how-to-handle-etimedout-error
https://blog.csdn.net/duzixi/article/details/53841162
https://stackoverflow.com/questions/53339823/error-connect-etimedout-at-tcpconnectwrap-afterconnect-as-oncomplete
関連
-
vueプロジェクトの起動に失敗しました。ENOENT: no such file or directory, open 'E:\CordovaProjectpackage.json'.
-
node.js UnhandledPromiseRejectionWarning エラーの解決方法
-
Expressのエラーを解決する。送信後にヘッダーを設定できない。
-
expressはエラーを報告します。エラー [ERR_HTTP_HEADERS_SENT]: ヘッダがクライアントに送信された後、ヘッダを設定することができません。
-
Ubuntu 20 nvmのインストールの問題(コマンドが見つからない)
-
UnhandledPromiseRejectionWarning:EACCES: 権限拒否エラー(npmでdevを実行した場合)に対する有効な解決策の可能性
-
エラーは正常に解決されました。モジュール 'html-webpack-plugin' が見つかりません。
-
Error: Cannot find module '.... /lib/utils/unsupported.js'。
-
Ejsエラーです。デフォルトエンジンが指定されておらず、拡張子も提供されていません。
-
ルーティングがエクスポートされないエラー。Router.use() はミドルウェアの関数を必要としますが、Object を取得しました。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Vue-npm ERR! コード ENOENT エラーの解決方法など
-
Mac ノードのバージョニング nvm コマンドが見つかりません。
-
npm install時にundefinedのプロパティを読み込めない('extraneous'を読み込む)。
-
Node.jsのエラーの解決策。Cannot find module express
-
gulp エラー。タスク関数を指定する必要があります
-
SMTP送信エラーコードと対処法
-
npm install で package.json が存在しないというエラーが報告される
-
Node Sass は現在の環境に対するバインディングを見つけることができませんでした。
-
LERNAの開発プロセス(ピット内とピット外)