2012-01-09 23 views
34

Düğümde süper basit bir sunucu yapıyorum ve onRequest dinleyicimde Statik bir dosyaya (diskin dışında) veya bazı jsonlara hizmet verip vermemeye karar veriyorum request.url'daki yola göre (muhtemelen Mongo'dan alınmıştır).Bir dosyanın varlığını kontrol etmenin en hızlı yolu NodeJs

Şu anda önce dosyayı (örneğin, mtime'ı başka bir yerde kullanıyorum) bildirmeye çalışıyorum ve bu başarısız olmazsa, içeriği disketten okurum. Böyle bir şey: request.url.pathname için fs.stat sonucunu önbellekleme daha

fs.stat(request.url.pathname, function(err, stat) { 
    if (!err) { 
     fs.readFile(request.url.pathname, function(err, contents) { 
      //serve file 
     }); 
    }else { 
     //either pull data from mongo or serve 404 error 
    } 
}); 

Diğer Bu check-up hızlandırmak bir şey var mı? Örneğin,hatalarının stat yerine görüp görmediğini görmek hızlı mıdır? Ya da fs.readFile yerine fs.createReadStream mu kullanıyorsunuz? Ya da child_process.spawn'da bir şey kullanarak dosyayı kontrol edebilir miyim? Temelde ben istek için veri göndermek için mongo gönderilmesi gerektiğinde w/fileio herhangi bir zaman harcama emin değilim istiyorum ...

Teşekkürler!

+4

yardımcı olabilir hep ihtiyaçlarına bağlı 'stat' veya' statSync' kullandım (örn ' StatSync 'config), ama teknik olarak 'readfile' yapmak ve bir hata yakalamak için daha hızlı olacağını tahmin ediyorum (hata, JS'de ___very___ ağır olsa da, yanlış olabilir). Genel olarak, “stat” ü kullanmayı tercih etmekteyim, çünkü sadece kasıtlı olarak bir hata atmaktan daha temiz. 'Düğüm 'Windoze sistemlerine bir itme yapıyor ve onu kullanarak herhangi bir kod kırmak için genellikle' child_process 'önlemek. –

+1

@Lite Byte, DeadDEnD tarafından verilen cevabı ciddi olarak kabul etmelisiniz ... –

cevap

56
var fs = require('fs'); 

fs.exists(file, function(exists) { 
    if (exists) { 
    // serve file 
    } else { 
    // mongodb 
    } 
}); 
+12

Sadece FYI, 'path.exists()', Düğüm'ün sonraki sürümlerinde kullanımdan kaldırılmıştır. Şimdi 'fs.exists()' dir. – MikeSchinkel

+0

Doğru. Teşekkür ederim. – fent

+7

'File' aslında bir dizin, sembolik bağlantı, boru vb. Olabilir. Sadece dosyaları bulmak için fs.stat (dosya, işlev (err, stats) {if (! Err && stats) gibi bir şey kullanabilirsiniz. isFile()) {// serve} else {// başka bir şey}}); Ama bu bile aslında bu dosyayı okuyabileceğinizi garanti etmiyor. İzinler yanlış olabilir veya dosya gerçekten okunmadan önce kaldırılmış olabilir. İçeriğe bağlı olarak, problemi çözmenin bir yolu sadece dosyayı okumayı denemek ve daha sonra başarısız olursa başka bir şey yapmak olabilir. Node dokümanlarından – tuomassalo

2

Sana önbelleğe alma mekanizması nasıl artırabileceğini ziyade bu konuda endişe gerektiğini düşünüyorum, ama yok. fs.stat dosya denetimi için gerçekten çok kolay, başka bir çocuk işleminde bunu yapmak muhtemelen daha sonra sizi yavaşlatır. Bu blog yayınında açıklandığı gibi

bağlayın, birkaç ay önce() Middleware sistemi staticCache uygulanan: http://tjholowaychuk.com/post/9682643240/connect-1-7-0-fast-static-file-memory-cache-and-more

bir önbellek algo basitçe, Cache nesnesi aracılığıyla uygulanır (LRU) Az-son-Kullanılmış önbellek nesneleri, vuruldukça döndürür. Bu , giderek daha popüler olan nesnelerin konumlarını koruduğu anlamına gelir; diğerleri ise yığınlardan ve toplanan çöplerden dışarı atılır.

Diğer kaynaklar:
http://senchalabs.github.com/connect/middleware-staticCache.html
The source code for staticCache

2

bu pasajı size

fs = require('fs') ; 
var path = 'sth' ; 
fs.stat(path, function(err, stat) { 
    if (err) { 
     if ('ENOENT' == err.code) { 
      //file did'nt exist so for example send 404 to client 
     } else { 
      //it is a server error so for example send 500 to client 
     } 
    } else { 
     //every thing was ok so for example you can read it and send it to client 
    } 
}); 
İlgili konular