1. ホーム
  2. ノード

エラー: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