Fs.readFileSync () এর জন্য কোনও ফাইল কীভাবে বন্দী করবেন?


135

নোড.জেএস-এর মধ্যে রিডফিল () কীভাবে ত্রুটি ক্যাপচার করতে পারে তা দেখায়, তবুও ত্রুটি পরিচালনার বিষয়ে রিডফায়ান্সিক () ফাংশনের জন্য কোনও মন্তব্য নেই । এর মতো, যদি কোনও ফাইল নেই তখন আমি যদি রিডফাইলসিঙ্ক () ব্যবহার করার চেষ্টা করি তবে আমি ত্রুটিটি পেয়েছি 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)

আপনি সবচেয়ে ভাল করতে পারেন এবং এটি বেশিরভাগ (সমস্ত না থাকলে) ত্রুটির ক্ষেত্রে সত্য হবে true সুতরাং আমি আপনাকে সাথে যেতে পরামর্শ দিইcode সম্পত্তিটির এবং এর মানটি পরীক্ষা :

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

এইভাবে, আপনি কেবলমাত্র এই নির্দিষ্ট ত্রুটিটি মোকাবেলা করুন এবং অন্য সমস্ত ত্রুটি পুনরায় নিক্ষেপ করুন।

বিকল্পভাবে, আপনি ত্রুটিটি অ্যাক্সেস করতে পারেন message বিশদ বার্তা যাচাই করতে সম্পত্তি , যা এই ক্ষেত্রে:

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

আশাকরি এটা সাহায্য করবে.


1
ধন্যবাদ, আমি সেই তথ্যটি খুঁজছিলাম। আমি কেবল অনুমান করেছি যে এটি একটি নির্দিষ্ট ধরণের ত্রুটি হবে। আমি ঠিক বুঝতে পেরেছি যে চেষ্টা / ধরা কীভাবে কাজ করে আমি ভুল বুঝেছি, আমি ভেবেছিলাম যে আপনি একটি নির্দিষ্ট ত্রুটির ধরণ (একটি লা জাভা) পেতে পারেন। গোলো তথ্যের জন্য ধন্যবাদ। :-)
ধাতব স্কিন

2
এছাড়াও EACCESকোড ক্ষেত্রে জন্য যদি বিবৃতিতে চেক করা উচিত কখন ফাইলটি নেই কিন্তু অনুমতি না থাকায় পড়া যাবে না
Gergely টথ

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
মোটেও ভাল নয়। যদি উপস্থিত ফাইল-সিঙ্ক এবং রিডফিলসাইক কলের মধ্যে ফাইলটি ডিস্ক থেকে সরানো হয় তবে কী হবে? আপনার কোড এখন একটি জাতি শর্ত ঘটতে অপেক্ষা বিল্ট ইন আছে ...
tkarls

2
@ টাকারলস হ্যাঁ এটি সম্পূর্ণরূপে সঠিক, এটি 2015 সালে লেখা হয়েছিল যখন আমি এখনও নোড.জেএস শিখছিলাম এবং এটির একটি রেসের শর্ত রয়েছে। যাইহোক, দুটি বিষয় লক্ষণীয়: এই বর্ণের শর্তের মিলটি এতই ন্যূনতম যে এটিকে মূলত উপেক্ষা করা যেতে পারে এবং দ্বিতীয়টি এবং প্রথমটিকে ছাড়িয়ে দেওয়া হচ্ছে যে আমি আজকাল আমার কোডটি আরও নমনীয় করে তুলি / async এর সাথে ধরা / অপেক্ষা করব "অন্যান্য" ব্যতিক্রম (যেহেতু নোড ব্যতিক্রম-বান্ধব)।
ফ্রান্সিসকো প্রেজেনসিয়া

1
রেস শর্তগুলি যতক্ষণ না তাদের কাজ করে না। সফ্টওয়্যারটি কেন এত বাগ-চালিত হয়, আপনার কম্পিউটারটি কেন প্রায়শই পুনরায় চালু করতে হবে, কেন এত সুরক্ষা দুর্বলতা ইত্যাদি রয়েছে ইত্যাদি ইত্যাদি উত্তর যেমন স্ট্যাক ওভারফ্লোতে সম্ভাব্য ক্ষতিকারক উত্তরের জন্য একটি পতাকা থাকা উচিত।
জোনাথন ট্রান

আরও একটি মন্তব্য এন বছর পরে, আরও একগুচ্ছ শিখার পরে (উত্তরে একটি নোট যুক্ত করুন)। কেবল লেখার জন্য কেবল ফাইল সিস্টেম প্রোগ্রামের প্রসঙ্গে এটি সম্পূর্ণ সূক্ষ্ম, তবে উল্লিখিত হিসাবে যদি ফাইলগুলিও সরিয়ে ফেলা যায় তবে এটির একটি রেসের শর্ত রয়েছে এবং এটি কোড নয় যে আমি আজকাল লিখব (বিশেষত সেই সিঙ্কের কারণে!)। আমি filesঅ্যাসিঙ্ক তৈরি করতে এবং চেষ্টা করার চেষ্টা / সহজ করার জন্য যা শিখেছি তার সাথে প্যাকেজটিও লিখেছি।
ফ্রান্সিসকো প্রেসেনেসিয়া

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
}

... যে 'ছোঁড়া ভুল;'
drudru

ফাংশনের সিঙ্ক নন সংস্করণ দিয়ে একই ত্রুটিটি ধরার কোনও উপায় আছে কি?
কি জাই

1
@ কিজে অ্যাসিঙ্ক কোডটি কলব্যাকের প্রথম যুক্তি হিসাবে ত্রুটিটি পাস করে, তাই যদি আপনি পরীক্ষা করেন যে আপনি একই আচরণ পেতে চাই।
লোগানফস্মিথ

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

আপনি আপনার পোস্টে যোগ করতে চাইতে পারেন যে আপনার সমাধানটি ইসমাস্ক্রিপ্ট for এর জন্য 6 . আমি কৌতূহলী, আপনি IE ব্যবহারকারীদের জন্য কিভাবে যত্ন নিতে?
মেটালস্কিন

2
@ মেটালস্কিন ওয়েবপ্যাক + বাবেল। তবে, fsএকটি নোড মডিউল
sdgfsdh

আহ, আমি নোডের সংস্পর্শে বাইরে আছি, আমি সন্দেহ করি যে নোড ES6 সমর্থন করেনি যখন আমি প্রশ্ন জিজ্ঞাসা করি (ভুল হতে পারে)। কিন্ডা ভুলে গিয়েছিলেন এটি একটি নোডের প্রশ্নও ছিল ;-)
মেটালস্কিন

এটি আপডেট করা ... fs.readFileAsync()এখনই fs.readFile() এবং node.js এ চেষ্টা / ক্যাপচারের ভিতরে অ্যাসিঙ্ক ফাংশনটি রাখা উচিত নয়। চেষ্টা / ধরার ফলে ত্রুটিটি কখনই অসম্পূর্ণ হবে না। পরিবর্তে কলব্যাকটিতে ত্রুটিটি পাস করুন এবং এটি হ্যান্ডেল করুন: fs.readFile('/etc/passwd', (err, data) => { if (err) throw err; console.log(data); }); থেকে: nodejs.org/dist/latest-v12.x/docs/api/…
কেএইচ বি

আমি বিশ্বাস করি যে প্রতিশ্রুতি প্রত্যাখ্যান করা হয় এবং আপনি যদি প্রতিশ্রুতির অপেক্ষায় থাকেন তবে চেষ্টা করার চেষ্টা করা হবে।
sdgfsdh

0

নোডজেএস দিয়ে আপনার কেবলমাত্র থ্রেডটি ব্লক করা এড়াতে পরিবর্তে অ্যাসিঙ্ক ব্যবহার করার চেষ্টা করুন । এই উদাহরণটি দেখুন:

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

পরে অন্য কোনও ফাংশন থেকে চেষ্টা / ধরার সাথে এই অ্যাসিঙ্ক ফাংশনটি ব্যবহার করতে পারে:

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 () এ গেছে বলে অ্যাসিঙ্ক্রোনাসলি বলা হয়। কলব্যাক কল করার সময়, চেষ্টা… ক্যাপ ব্লক সহ আশেপাশের কোডটি ইতিমধ্যে বের হয়ে আসবে। কলব্যাকের ভিতরে একটি ত্রুটি নিক্ষেপ করা বেশিরভাগ ক্ষেত্রে নোড.জেএস প্রক্রিয়াটি ক্র্যাশ করতে পারে। যদি ডোমেনগুলি সক্ষম করা থাকে, বা কোনও হ্যান্ডলার প্রসেস.অন ('অনুজ্ঞাপূর্ণ ধারণা') এর সাথে নিবন্ধিত হয়েছে, তবে এই ধরনের ত্রুটিগুলি বাধা দেওয়া যেতে পারে।

উল্লেখ: https://nodejs.org/api/erferences.html

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.