2013-01-18 16 views
82

node.js içinde readFile() bir hatayı nasıl yakalayacağını gösterir, ancak hata işleme ile ilgili readFileSync() işlevine ilişkin yorum yoktur. Bu nedenle, herhangi bir dosya olduğunda readFileSync() işlevini kullanmaya çalışırsam, Error: ENOENT, no such file or directory hatasını alırım.fs.readFileSync() için dosya nasıl kaydedilir?

Atılan istisnayı nasıl yakalarım? Doco hangi istisnaların atıldığını belirtmiyor, bu yüzden hangi istisnaların yakalanmam gerektiğini bilmiyorum. Unutmamalıyım ki, 'her bir olası istisnayı yakala' tarzı try/catch ifadelerini beğenmem. Bu durumda, dosya mevcut olmadığında ortaya çıkan ve readFileSync'i gerçekleştirmeye çalıştığım belirli bir özel durumu yakalamak istiyorum.

Sen hatayı yakalamak zorunda ben senkronizasyon işlevleri kullanarak olmamalıdır yorumlar

+0

Ayrıca 'fs kullanabilirsiniz. [yeni cevabım] (http://stackoverflow.com/a/32804614/938236) –

cevap

127

Temelde, fs.readFileSync hata verir. sadece kendi prototip zincirinde bakarak

var fileContents; 
try { 
    fileContents = fs.readFileSync('foo.bar'); 
} catch (err) { 
    // Here you get the error when the file was not found, 
    // but you also get any other error 
} 

Maalesef atılmış edildiği hata tespit edemez: Bu hata Error prototipten ve throw kullanılarak atılmış, yakalamak için dolayısıyla tek yolu bir try/catch bloğu ile

if (err instanceof Error) 

yapabileceğiniz en iyi yöntemdir ve bu (hepsi olmasa bile) hataların çoğu için geçerli olacaktır.

if (err.code === 'ENOENT') { 
    console.log('File not found!'); 
} else { 
    throw err; 
} 

Bu şekilde, yalnızca bu hata ile uğraşmak ve diğer tüm hataları yeniden atmak: Dolayısıyla ben code özelliğiyle gitmeniz ve değerini kontrol öneririm. Bu yardımcı olur

ENOENT, no such file or directory 'foo.bar' 

Hope:

Alternatif olarak, bu durumda olduğu ayrıntılı hata iletisi, doğrulamak için hatanın message özelliğine erişebilir.

+0

Teşekkürler, aradığım bilgi bu. Sadece belirli bir Hata tipi olacağını düşündüm. Ayrıca, deneyin/yakalamanın nasıl çalıştığını yanlış anladığımı fark ettim, belirli bir hata türünü (la java) yakalayabileceğinizi düşünüyordum. Golo bilgisi için teşekkürler. :-) – Metalskin

+0

Rica ederim :-)! –

+1

Ayrıca "EACCES" kodu, dosya var olduğunda ancak –

7

:-) gerekli değildir bu yüzden, sadece senkronizasyon işlevlerini yerine bağlantı girişimlerini servis etmeden önce başlatmak ediyorum lütfen unutmayın ve sonra ne tür bir hata olduğunu kontrol edin. Bir dosya bulunamadığında görüntülenen

try { 
    var data = fs.readFileSync(...) 
} catch (err) { 
    // If the type is not what you want, then just throw the error again. 
    if (err.code !== 'ENOENT') throw err; 

    // Handle a file-not-found error 
} 
+0

'da görülebileceği gibi existsSync() '...' at err; ' – drudru

+0

@drudru İyi arama, düzeltildi. – loganfsmyth

12

Kabul edilen çözüm tamam olsa da, bunu işlemenin daha iyi bir yolunu buldum. Dosya eşzamanlı varsa sadece kontrol edebilirsiniz:

var file = 'info.json'; 
var content = ''; 

// Check that the file exists locally 
if(!fs.existsSync(file)) { 
    console.log("File not found"); 
} 

// The file *does* exist 
else { 
    // Read the file and do anything you want 
    content = fs.readFileSync(this.local, 'utf-8'); 
} 
+2

izinlerinin eksikliğinden dolayı okunamıyorsa if deyiminde kontrol edilmelidir, fs.existsSync [artık kullanımdan kaldırılmamıştır] (https://nodejs.org /api/fs.html#fs_fs_existssync_path): "fs.exists() öğesinin kullanımdan kaldırıldığını, ancak fs.existsSync() öğesinin kullanılmadığını unutmayın." – falkodev

+3

Hiç daha iyi değil. Dosya existsSync ve readFileSync çağrısı arasında diskten kaldırılırsa ne olur? Kodunuz artık beklemek için inşa edilmiş bir yarış koşulu var ... – tkarls

+1

@tkarls Evet, evet, hala Node.js öğreniyordum ve bir yarış durumu var. Bununla birlikte, dikkat edilmesi gereken iki nokta: Bu yarış koşulunun benzerliği, temel olarak göz ardı edilebilecek kadar az ve ikincisinin ikincisini üst üste koyma, günümüzde, benim kodumun daha esnek olmasını sağlamak için async/beklemeyle try/catch'u kullanmamdır. "diğer" istisnalar (Düğüm istisna dostu olduğundan). –

3

Bunları senaryolar için bir hemen çağrılan lambda kullanın:

const config = (() => { 
    try { 
    return JSON.parse(fs.readFileSync('config.json')); 
    } catch (error) { 
    return {}; 
    } 
})(); 

async sürümü:

const config = await (async() => { 
    try { 
    return JSON.parse(await fs.readFileAsync('config.json')); 
    } catch (error) { 
    return {}; 
    } 
})(); 
+0

Çözümünüzün ECMAScript 6'ya uygun olduğunu eklemek isteyebilirsiniz. 01/01/18 tarihinden itibaren IE'nin yaklaşık% 77 oranında tarayıcı kullanımı kapsamına sahip bir desteği yoktur (https://caniuse.com/#feat= ok fonksiyonlar). Merak ediyorum, IE kullanıcılarına nasıl hizmet veriyorsunuz? – Metalskin

+0

@Metalskin Webpack + Babel. Ancak, 'fs' bir Düğüm Modülüdür – sdgfsdh

+0

Ahh, düğüm ile bağlantıda kalmıyorum, soruyu sorduğumda (yanlış olabilir) düğümün ES6'yı desteklemediğinden şüpheleniyorum. Kinda, bunun bir düğüm sorunu olduğunu da unuttu ;-) ;-) – Metalskin

İlgili konular