0
我將文件存儲在Amazon S3中,但也維護本地文件緩存。當我需要一個文件時,我想首先檢查緩存。我希望避免在讀取之前測試本地文件存在,這是因爲fs.exists將被棄用,並且可以在存在檢查和讀取文件之間真正刪除文件。將本地文件流與回退到其他源
我想使用承諾和流。下面的例子有一個回退到另一個本地文件。我的真實代碼將有S3作爲後備。
下面是一個很好的解決方案嗎? 我發現獲取失敗讀取信息的唯一方法是將錯誤處理程序連接到流。一旦我得到「可讀」事件,我就解開我的臨時錯誤處理程序。
我也想知道如果我真的需要解開處理程序,當我用「一次」掛鉤它。
'use strict';
const fs = require('fs');
function tryToReadLocalFile() {
return new Promise(function(resolve, reject) {
let rs = fs.createReadStream('./test1.txt');
let errorListener = function(err) {
reject(err);
};
rs.once('error', errorListener)
rs.on('readable',() => {
rs.removeListener('error', errorListener);
resolve(rs)
});
});
}
function tryToReadAnotherFile() {
return new Promise(function(resolve, reject) {
let rs = fs.createReadStream('./test2.txt');
let errorListener = function(err) {
reject(err);
};
rs.once('error', errorListener)
rs.on('readable',() => {
rs.removeListener('error', errorListener);
resolve(rs)
});
});
}
tryToReadLocalFile()
.catch(function(err) {
if(err.code === 'ENOENT') {
console.log('test1.txt not found. Fallback to test2.txt')
//Reading from another file as a test. Should read from S3 as fallback
return tryToReadAnotherFile();
} else {
return Promise.reject(err);
}
}).then(function(file) {
console.log('writing to test.txt');
let ws = fs.createWriteStream('./test.txt');
file.pipe(ws);
});
----------編輯 - >
我現在已經實施了上述的更緊湊。儘管如此,我仍然會對這方面的任何意見表示感謝。這是解決這個問題的好方法嗎?
正如你所看到的,我不打擾檢查ENOENT了。無論錯誤是什麼,我都想回到S3。
function getFileFromStorageP(options) {
return new Promise(function(resolve, reject) {
let rs = fs.createReadStream(path.join(env.fsp.cacheDir, options.fileId));
rs.once('error', (err) => {reject(err)});
rs.once('readable',() => {resolve(rs)});
}).catch(function(err) {
return srvS3.download({
fileId: options.fileId
});
});
}