iT邦幫忙

0

nodejs 下載zip不完全問題

一個更新的程式,分成兩個檔案
一個檢查,一個下載
原本下載都會不完全,加了timeout之後就好了,
有人可以解釋為什麼嗎?
code 如下
check檔

function check() {
    return new Promise((resolve) => {
        request( url , function(err, res, body) {
            var obj = JSON.parse(body);
            if( obj.url != null || obj.url != undefined) {
                resolve({url:data.url , name:obj.url});
            }else {
                resolve(null);
            }
        });
    }); 
}

async function method() {
    var dat = await check();
    if( dat ) {
        setTimeout(() => {
            download(dat.url, dat.name);
        }, 1500)
    }
}

download檔

module.exports = function(url,filename) {
    request(url)
        .pipe(fs.createWriteStream(filename))
        .on('close', function () {
            console.log('File written!');
        });
}
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2019-06-26 20:19:16
最佳解答

他有說了下載zip,這讓我猜測可能一件事。
就是它的zip有可能是在更新檢查時才開始建立zip檔。
然後要馬上按下載。

但zip建立是需要時間的。所以有很大的可能性會下載到不完全的zip。

一般要避免該情況。我大多是建立zip時會先放到temp檔上。等建立完全後才會移到正式的位置下載。

不過會發生這樣的情況是要如我說的,更新檢查時才建立zip的情況。該問題才會成立。
如果是早就建好的zip放在那邊下載不完全。我就猜不到原因了。

看更多先前的回應...收起先前的回應...
ms0369033 iT邦新手 5 級 ‧ 2019-06-27 09:59:51 檢舉

哦哦謝謝你,我的確是這樣做,以後我會把流程說明清楚
那我也可以建立完再回傳嗎?

fillano iT邦超人 1 級 ‧ 2019-06-27 10:15:00 檢舉

另外,他程式裡看起來完全不處理錯誤或異常...(也許是沒貼出來?)

我會建議要處理reject的狀況,他的Promise只處理resolve。其中request的callback第一個丟進來的參數是error,這個要最先處理的,不然錯誤都發生了程式還繼續跑...

然後可以用

var dat = await check().catch(e=>console.error(e.message));

來處理async function裡面發生的例外等等。

在stream裡可以用事件監控接收過程,這樣也可以比較容易確定問題發生的時機。

這些都是簡單地自己檢查問題的技巧,只是有沒有做。

ms0369033 iT邦新手 5 級 ‧ 2019-06-27 10:37:06 檢舉

謝謝指導,其實沒有加reject的習慣,以後會記得的

正常是怎麼做就看個人的開發習慣。
我個人是在更新或是建立時。會先產生好預備下載的連結。
客戶是得要另外去下載頁下載。
但下載頁會去檢查該下載檔是否存在,不存在則是先不給下載。

而我下載檔的產生,就如我上面說的,在建立壓縮檔是先在temp檔中處理。但zip處理完成後。才會將temp檔更名移到正式下載的空間上下載。

因為我的是報表特性,所以是分兩階段進行沒問題。

如果你的特性是需要等待立即處理下載。那就最好用檢查的方式或是等待頁面的方式處理。

ms0369033 iT邦新手 5 級 ‧ 2019-06-27 18:47:17 檢舉

我重新規劃流程好了 謝謝大家幫忙

2
dragonH
iT邦超人 5 級 ‧ 2019-06-26 15:49:44

感覺你的 code 好像哪裡怪怪的

resolve({url:data.url , name:obj.url});

其中的 data.url 是從哪裡來的?/images/emoticon/emoticon19.gif

然後你用 request 去做你所謂的 check

這樣不會等同於多下載一次嗎?

還是我誤會了什麼/images/emoticon/emoticon13.gif


上面還有一串引入data.url從那裡引入的,check是去跟另一端確認版本,需要再更新。

@ms0369033

喔喔

所以也就是說 check 跟 download 的 url 不一樣就是了

不過我剛單獨測你寫的 download.js

把 settimeout 拿掉

就算是下載 1G 多的 android studio

也沒有發生你說的情況

估計你的問題應該是別的地方造成的

ms0369033 iT邦新手 5 級 ‧ 2019-06-26 16:18:32 檢舉

上面還有一串引入data.url從那裡引入的,check是去跟另一端確認版本,需要再更新。

我要發表回答

立即登入回答