Fs.readFileSync () के लिए कोई फ़ाइल कैसे कैप्चर करें?


135

Node.js के भीतर readFile () दिखाता है कि किसी त्रुटि को कैसे कैप्चर किया जाए, हालांकि त्रुटि हैंडलिंग के बारे में readFileSync () फ़ंक्शन के लिए कोई टिप्पणी नहीं है । जैसे, अगर मैं कोई फ़ाइल नहीं होने पर readFileSync () का उपयोग करने का प्रयास करता हूं, तो मुझे त्रुटि मिलती है Error: ENOENT, no such file or directory

मुझे फेंके जा रहे अपवाद को कैसे पकड़ना चाहिए? डोको ने यह नहीं बताया कि अपवाद क्या हैं, इसलिए मुझे नहीं पता कि मुझे किन अपवादों को पकड़ने की जरूरत है। मुझे ध्यान देना चाहिए कि मुझे जेनेरिक पसंद नहीं है 'ट्राई / कैच स्टेटमेंट्स' की हर संभव अपवाद शैली को पकड़ें। इस मामले में, मैं उस विशिष्ट अपवाद को पकड़ना चाहता हूं जो तब होता है जब फ़ाइल मौजूद नहीं होती है और मैं रीडफ़ाइलसिंक प्रदर्शन करने का प्रयास करता हूं।

कृपया ध्यान दें कि मैं कनेक्शन प्रयासों की सेवा करने से पहले केवल स्टार्ट अप पर सिंक कार्य कर रहा हूं, इसलिए मुझे लगता है कि सिंक फ़ंक्शन का उपयोग नहीं किया जाना चाहिए टिप्पणी :-)


1
आप भी उपयोग fs.existsSync()कर सकते हैं जैसा कि मेरे नए उत्तर
फ्रांसिस्को प्रेसेनिया

जवाबों:


206

मूल रूप से, fs.readFileSyncजब कोई फ़ाइल नहीं मिलती है तो एक त्रुटि फेंकता है। यह त्रुटि Errorप्रोटोटाइप से है और throwइसका उपयोग किया जाता है , इसलिए पकड़ने का एकमात्र तरीका एक try / catchब्लॉक के साथ है :

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
}

दुर्भाग्य से आप यह नहीं पता लगा सकते हैं कि किस त्रुटि को इसकी प्रोटोटाइप श्रृंखला को देखकर ही फेंक दिया गया है:

if (err instanceof Error)

सबसे अच्छा आप कर सकते हैं, और यह सबसे (यदि सभी नहीं) त्रुटियों के लिए सच होगा। इसलिए मेरा सुझाव है कि आप codeसंपत्ति के साथ जाएं और इसके मूल्य की जांच करें:

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

इस तरह, आप केवल इस विशिष्ट त्रुटि से निपटते हैं और अन्य सभी त्रुटियों को फिर से फेंक देते हैं।

वैकल्पिक रूप से, आप messageविस्तृत त्रुटि संदेश को सत्यापित करने के लिए त्रुटि की संपत्ति तक भी पहुंच सकते हैं , जो इस मामले में है:

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

उम्मीद है की यह मदद करेगा।


1
धन्यवाद, यह वह जानकारी है जिसकी मुझे तलाश थी। मैंने अभी अनुमान लगाया है कि यह एक विशिष्ट प्रकार की त्रुटि होगी। मैंने यह भी महसूस किया है कि मैंने गलत समझा कि कोशिश / कैच कैसे काम करता है, मैं सोच रहा था कि आप एक विशिष्ट त्रुटि प्रकार (एक ला जावा) पकड़ सकते हैं। Golo जानकारी के लिए धन्यवाद। :-)
मेटल्सकिन

2
EACCESजब फ़ाइल होती है तो केस के लिए स्टेटमेंट में भी कोड की जाँच की जानी चाहिए, लेकिन अनुमतियों की कमी के कारण पढ़ा नहीं जा सकता
Gothely Toth

21

मैं इसे संभालने का यह तरीका पसंद करता हूं। यदि फ़ाइल समकालिक रूप से मौजूद है, तो आप देख सकते हैं:

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(file, 'utf-8');
}

नोट: यदि आपका प्रोग्राम फ़ाइलों को हटाता है, तो यह एक दौड़ की स्थिति है जैसा कि टिप्पणियों में नोट किया गया है। हालांकि, यदि आप केवल उन्हें हटाने के बिना, फ़ाइलों को लिखते या अधिलेखित करते हैं, तो यह पूरी तरह से ठीक है।


2
अब, fs.existsSync को अब नहीं निकाला गया है : "ध्यान दें कि fs.exists () पदावनत है, लेकिन fs.existsSync () नहीं है।"
फाल्केदेव

17
बेहतर बिल्कुल नहीं। क्या होगा यदि फ़ाइल मौजूद से हटा दी जाती है मौजूद हैSync और readFileSync कॉल के बीच? आपके कोड में अब एक दौड़ की स्थिति है जो होने की प्रतीक्षा में निर्मित है ...
tkarls

2
@tkarls हाँ जो पूरी तरह से सही है, यह 2015 में लिखा गया था जब मैं अभी भी Node.js सीख रहा था और इसकी एक दौड़ की स्थिति है। हालांकि, दो बातों पर ध्यान दें: इस दौड़ की स्थिति की संभावना इतनी कम है कि इसे मूल रूप से नजरअंदाज किया जा सकता है, और दूसरी और पहली बात यह है कि मैं async के साथ कोशिश / पकड़ का उपयोग करूँगा / आजकल अपने कोड को लचीला बना रहा हूं "अन्य" अपवाद (चूंकि नोड अपवाद-अनुकूल है)।
फ्रांसिस्को प्रेसेनिया जूल

1
रेस की स्थितियां तब तक मायने नहीं रखती हैं जब तक वे करते हैं। इस तरह के उत्तर दिए गए हैं कि सॉफ्टवेयर इतना बग-राइडेड क्यों है, आपको अपने कंप्यूटर को इतनी बार रिस्टार्ट करने की आवश्यकता क्यों है, क्यों इतने सारे सुरक्षा भेद्यताएं हैं, आदि, स्टैक ओवरफ्लो में संभावित हानिकारक उत्तरों के लिए एक झंडा होना चाहिए।
योनातान ट्रान

एक और टिप्पणी एन साल बाद, एक गुच्छा अधिक सीखने के बाद (उत्तर में एक नोट जोड़ा गया)। यह केवल राइट-ओनली फाइलसिस्टम प्रोग्राम के संदर्भ में ठीक है, लेकिन जैसा कि अगर फाइलों को हटाया जा सकता है, तो यह एक दौड़ की स्थिति है और यह कोड नहीं है जो मैं आजकल लिख रहा हूं (विशेष रूप से उस सिंक के कारण!)। मैंने पैकेज filesको भी लिख दिया है, जो कि मैं async बनाना सीख रहा हूँ और आसानी से पकड़ सकता हूँ।
फ्रांसिस्को प्रेसेंसिया

11

आपको त्रुटि को पकड़ना होगा और फिर जांचना होगा कि यह किस प्रकार की त्रुटि है।

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
}

... कि 'गलती से फेंक?'
ड्रुडू

क्या फ़ंक्शन के गैर-सिंक संस्करण के साथ उसी त्रुटि को पकड़ने का कोई तरीका है?
की

1
@ KiJéy Async कोड कॉलबैक के पहले तर्क के रूप में त्रुटि पास करता है, इसलिए यदि आप जांचते हैं कि आपको समान व्यवहार मिलेगा।
लोगान्सफैमेथ

4

मैं इन परिदृश्यों के लिए एक तुरंत लागू लैम्ब्डा का उपयोग करता हूं:

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

async संस्करण:

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

आप अपनी पोस्ट में जोड़ना चाह सकते हैं कि आपका समाधान ECMAScript 6 के लिए है। 01/01/18 तक IE के पास ब्राउज़र उपयोग के लगभग 77% कवरेज के साथ कोई समर्थन नहीं है ( caniuse.com/#feat=arrow-functions )। मैं उत्सुक हूँ, आप IE उपयोगकर्ताओं के लिए कैसे पूरा करते हैं?
मेट्सकिन

2
@ मेटल्सकिन वेबपैक + बैबल। हालाँकि, fsएक नोड मॉड्यूल है
sdgfsdh

आह, मैं नोड के संपर्क से बाहर हूं, मुझे संदेह है कि जब मैंने सवाल पूछा तो नोड ईएस 6 का समर्थन नहीं करता (गलत हो सकता है)। Kinda भूल गया यह एक नोड सवाल भी था ;-)
मेटल्किन

इसे अपडेट कर रहा है ... fs.readFileAsync()अब है fs.readFile() और यह भी async फ़ंक्शन को नोड में एक कोशिश / पकड़ के अंदर नहीं डालना चाहिए। जब भी यह async है कोशिश / कैच को त्रुटि नहीं मिलेगी। इसके बजाय कॉलबैक में त्रुटि पास करें और इसे वहां fs.readFile('/etc/passwd', (err, data) => { if (err) throw err; console.log(data); }); से हैंडल करें: से: nodejs.org/dist/latest-v12.x/docs/api/…
KH B

मुझे विश्वास है कि यदि वादे को खारिज कर दिया जाता है तो आप को पकड़ने का प्रयास किया जाएगा और आप वादे का इंतजार कर रहे हैं।
sdgfsdh

0

NodeJS के साथ आपके पास एकमात्र धागे को अवरुद्ध करने के बजाय Async का उपयोग करने का प्रयास करें । इस उदाहरण की जाँच करें:

const util = require('util');
const fs = require('fs');
const path = require('path');
const readFileAsync = util.promisify(fs.readFile);

const readContentFile = async (filePath) => {
  // Eureka, you are using good code practices here!
  const content = await readFileAsync(path.join(__dirname, filePath), {
    encoding: 'utf8'
  })
  return content;
}

बाद में किसी अन्य फ़ंक्शन से कोशिश / कैच के साथ इस async फ़ंक्शन का उपयोग कर सकते हैं:

const anyOtherFun = async () => {
  try {
    const fileContent = await readContentFile('my-file.txt');
  } catch (err) {
    // Here you get the error when the file was not found,
    // but you also get any other error
  }
}

हैप्पी कोडिंग!


0

जावास्क्रिप्ट की कोशिश ... पकड़ तंत्र अतुल्यकालिक एपीआई द्वारा उत्पन्न त्रुटियों को रोकने के लिए इस्तेमाल नहीं किया जा सकता है। शुरुआती लोगों के लिए एक सामान्य गलती यह है कि एक त्रुटि-पहली कॉलबैक के अंदर फेंक का उपयोग करने की कोशिश करें:

// THIS WILL NOT WORK:
const fs = require('fs');

try {
  fs.readFile('/some/file/that/does-not-exist', (err, data) => {
    // Mistaken assumption: throwing here...
    if (err) {
      throw err;
    }
  });
} catch (err) {
  // This will not catch the throw!
  console.error(err);
}

यह काम नहीं करेगा क्योंकि कॉलबैक फ़ंक्शन fs.readFile () को पारित किया गया है जिसे अतुल्यकालिक रूप से कहा जाता है। जब तक कॉलबैक को कॉल किया जाता है, तब तक कोशिश ... कैच ब्लॉक सहित आसपास का कोड पहले ही निकल चुका होगा। कॉलबैक के अंदर एक त्रुटि को फेंकना ज्यादातर मामलों में Node.js प्रक्रिया को क्रैश कर सकता है। यदि डोमेन सक्षम हैं, या एक हैंडलर प्रक्रिया के साथ पंजीकृत किया गया है। ('पहुंच नहीं'), ऐसी त्रुटियों को रोका जा सकता है।

संदर्भ: https://nodejs.org/api/errors.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.