2017-10-11 40 views
1

我使用ssh2-sftp客戶端爲nodeJS連接到sftp服務器並獲取一個文件 但我遇到了一個問題,當有更多的塊比一個,數據沒有被正確接收,它失去了塊之間的一個角色:
例:在SFTP文件有
「從SFTP文件中的一些字符串」,如果它是在大塊分裂,接收到的數據將是這樣的:
第一chunk:'some string f'
second chink:'om sftp file'
在這個例子中'r'丟失了
數據事件可讀流丟失塊的第一個/最後一個字符

const getFile = readable => new Promise((resolve, reject) => { 
    let file = ''; 
    readable.on('data', (chunk) => { file += chunk; }); 
    readable.on('end',() => resolve(file)); 
    readable.on('error', reject); 
}); 

const readable = await sftp.get(fileName, false); 

sftp.get()返回NodeJS.ReadableStream

是否有人滿足同樣的問題?

回答

0

經過長時間的研究,我在模塊sftp-stream中發現了可讀流的問題highWaterMark被設置爲64 * 1024,並且錯誤是如果一個塊有64 * 1024咬傷,則會丟失一個咬合點。我只是將水印設置爲64 * 1024-1。

+0

我面臨同樣的問題。更改水印不能解決sftp的問題。 – orhankutlu

0

是更可取的塊存儲爲一個數組,然後CONCAT他們進入緩衝區,並獲得字符串值的末尾:

const fs = require('fs'); 

const getFile = readable => new Promise((resolve, reject) => { 
    const file = []; 
    readable.on('data', chunk => file.push(Buffer.from(chunk, 'base64'))); 
    readable.on('end',() => resolve(Buffer.concat(file).toString())); 
    readable.on('error', reject); 
}); 


const readable = fs.createReadStream('package.json'); 

getFile(readable).then(file => console.log('file', file)); 

本地拼命地跑,並讓我的文件的內容如預期。

+0

我在這個錯誤讓 類型錯誤:「列表」參數必須是緩衝或Uint8Array實例的Array –

+0

我得到了一個語法errorm現在是固定 –

+0

問題是不是因爲語法 –

相關問題