2012-01-09 18 views
34

में फ़ाइल के अस्तित्व की जांच करने का सबसे तेज़ तरीका मैं नोड में एक सुपर सरल सर्वर का निर्माण कर रहा हूं और मेरे ऑनवेस्ट श्रोता में मैं यह निर्धारित करने की कोशिश कर रहा हूं कि मुझे एक स्थिर फ़ाइल (डिस्क से बाहर) या कुछ जेसन की सेवा करनी चाहिए या नहीं (शायद मोंगो से खींचा गया) request.url में पथ के आधार पर।नोडजेस

वर्तमान में मैं पहले फ़ाइल को स्टेट करने की कोशिश कर रहा हूं (क्योंकि मैं कहीं और mtime का उपयोग करता हूं) और यदि यह असफल नहीं होता है तो मैं डिस्क से सामग्री को पढ़ता हूं। कुछ इस तरह:

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 
    } 
}); 

request.url.pathname के लिए fs.stat का परिणाम cacheing अलावा, कुछ है कि इस जांच में तेजी लाने सकता है? उदाहरण के लिए, यह stat के बजाय fs.readFile त्रुटियों को देखने के लिए जितना तेज़ होगा? या fs.readFile के बजाय fs.createReadStream का उपयोग कर रहे हैं? या क्या मैं संभावित रूप से child_process.spawn में कुछ का उपयोग कर फ़ाइल की जांच कर सकता हूं? असल में मैं यह सुनिश्चित करना चाहता हूं कि जब मैं डेटा के लिए अनुरोध के लिए मोंगो को भेजा जाना चाहिए तो मैं कोई अतिरिक्त समय गड़बड़ाना w/fileio खर्च नहीं कर रहा हूं ...

धन्यवाद!

+4

मदद कर सकते हैं मैं हमेशा 'stat' या' statSync' का उपयोग किया है मेरी जरूरतों के आधार पर (जैसे ' statSync' कॉन्फ़िगरेशन में), लेकिन मुझे लगता है कि यह तकनीकी रूप से 'readfile' करने के लिए तेज़ होगा और एक त्रुटि पकड़ लेगा (हालांकि जेएस में त्रुटि पकड़ने ___very___ भारी है, इसलिए मैं गलत हो सकता हूं)। आम तौर पर, हालांकि, मैं बस 'stat' का उपयोग करना पसंद करूंगा क्योंकि यह जानबूझकर त्रुटि को फेंकने से साफ़ है। सामान्य रूप से 'child_process' से बचें क्योंकि 'नोड' विंडोज सिस्टम पर धक्का दे रहा है और इसका उपयोग करने वाला कोई भी कोड तोड़ देगा। –

+1

@ लाइट बाइट आपको डेडडेनडी द्वारा दिए गए उत्तर को गंभीरता से स्वीकार करना चाहिए ... –

उत्तर

56
var fs = require('fs'); 

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

बस FYI, 'path.exists()' को नोड के बाद के संस्करणों में बहिष्कृत कर दिया गया है। अब यह 'fs.exists() 'है। – MikeSchinkel

+0

यह सही है। धन्यवाद। – fent

+7

कृपया ध्यान दें कि 'फ़ाइल' वास्तव में एक निर्देशिका, सिम्लिंक, पाइप इत्यादि हो सकती है। केवल फाइलों को खोजने के लिए, आप' fs.stat (फ़ाइल, फ़ंक्शन (त्रुटि, आंकड़े) {if (! Err && stats) जैसे कुछ का उपयोग कर सकते हैं। isFile()) {// सेवा} अन्य {// कुछ और}}); 'लेकिन यहां तक ​​कि यह गारंटी नहीं देता है कि आप वास्तव में उस फ़ाइल को पढ़ सकते हैं। अनुमतियां गलत हो सकती हैं, या फ़ाइल को वास्तव में पढ़ने से पहले ही हटाया जा सकता है। संदर्भ के आधार पर, समस्या से संपर्क करने का एक तरीका हो सकता है कि फ़ाइल को पढ़ने का प्रयास करें और फिर विफल होने पर कुछ और करें। नोड डॉक्स से – tuomassalo

2

मुझे नहीं लगता कि आपको इसके बारे में चिंता करनी चाहिए, बल्कि आप कैशिंग तंत्र को कैसे सुधार सकते हैं। fs.stat फ़ाइल जांच के लिए वास्तव में ठीक है, ऐसा करने से दूसरे बच्चे की प्रक्रिया में शायद आपको धीमा कर दिया जाएगा बल्कि आपकी मदद करेगा।

कनेक्ट इस ब्लॉग पोस्ट में वर्णित है, लागू किया staticCache() मिडलवेयर कुछ महीने पहले: http://tjholowaychuk.com/post/9682643240/connect-1-7-0-fast-static-file-memory-cache-and-more

एक हाल ही सबसे कम प्रयुक्त (LRU) कैश algo Cache वस्तु के माध्यम से कार्यान्वित, बस है घुमावदार कैश ऑब्जेक्ट्स जैसे वे हिट होते हैं। यह का अर्थ है कि तेजी से लोकप्रिय वस्तुएं अपनी स्थिति बनाए रखती हैं जबकि दूसरों को ढेर और कचरे से बाहर निकाला जाता है।

अन्य संसाधन:
http://senchalabs.github.com/connect/middleware-staticCache.html
The source code for staticCache

2

इस स्निपेट आप

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 
    } 
}); 
संबंधित मुद्दे