मैंने अभी Node.js सीखना शुरू किया है और सीधे निम्नलिखित कोड के साथ अटक गया:

const fs = require(`fs`);

fs.appendFile(`mynewfile1.txt`, `Hello content!`, err => {
  if (err) throw err;
  console.log(`Saved!`);
});

fs.rename(`mynewfile1.txt`, `myrenamedfile.txt`, err => {
  if (err) throw err;
  console.log(`File Renamed!`);
});

यह app.js में स्थित है और चलने से पहले इस निर्देशिका में कोई अन्य फ़ाइल नहीं है

जब मैं इसे चलाता हूं (node app.js बैश कमांड के साथ), तो यह स्थिर आउटपुट देता है:

> File Renamed!
> Saved!

मैं समझता हूं कि दोनों ऑपरेशन अतुल्यकालिक रूप से चलते हैं और मुझे लगता है कि एक फ़ाइल का नाम बदलना एक नया बनाने की तुलना में तेज़ होना चाहिए, लेकिन fs.rename को फेंकना माना जाता है यदि हम जिस फ़ाइल का नाम बदलने का प्रयास करते हैं वह मौजूद नहीं है और ठीक है, यह तब होता है जब पहला कथन मौजूद नहीं है। अन्यथा यह दिखावा करता है कि सब कुछ ठीक है।

मुझे लगता है कि ऐसा इसलिए होता है क्योंकि महंगा I/O नोड निष्पादित करने से पहले किसी भी तरह से संचालन का मूल्यांकन करता है और, मेरे मामले में, एक नई फ़ाइल बनाने और उसका नाम बदलने के बजाय, बस myrenamedfile.txt नाम की फ़ाइल बनाता है।

मेरे प्रश्न हैं:

  1. क्या मैं अपनी आखिरी धारणा में सही हूँ? यदि हां, तो क्या आप कृपया इसके बारे में कुछ दस्तावेज़ीकरण की ओर संकेत कर सकते हैं, अन्यथा, क्या आप कृपया बता सकते हैं कि ऐसा क्यों होता है?
  2. क्या आप मुझे उन नियमों के बारे में भी बता सकते हैं जो इस मामले में fs.rename के व्यवहार को नियंत्रित करते हैं? मेरा मतलब है कि, यह स्पष्ट रूप से एक मौजूदा फ़ाइल का वास्तव में फिर से नाम नहीं देता है (क्योंकि यह उस समय अभी तक नहीं बनाया गया है), इसे कुछ अलग करना चाहिए। तो, इस "कुछ अलग" के लिए दस्तावेज कहां है? मुख्य दस्तावेज़ इसे निर्दिष्ट नहीं करता है।

यूपीडी:

अब तक प्रतिक्रिया देने वाले सभी अच्छे लोगों का बहुत-बहुत धन्यवाद, मुझे पता है कि या तो promisify utils मॉड्यूल से या प्रायोगिक require('fs').promises का उपयोग जरूरत पड़ने पर संचालन को श्रृंखलाबद्ध करने के लिए किया जा सकता है, लेकिन सवाल यह है कि क्यों कोड काम करता है और त्रुटि नहीं देता है, न कि कैसे संचालन को एक साथ जंजीर में बांधा जा सकता है।

-1
Igor Bykov 6 अक्टूबर 2019, 13:45

3 जवाब

सबसे बढ़िया उत्तर

हाँ अतुल्यकालिक प्रवाह के बारे में आपकी धारणा सही है। चूंकि फ़ाइल प्रारंभ में मौजूद नहीं है और नाम बदलें को सक्रिय किया जाता है, भले ही appendFile पूरा हो या नहीं, यह no such file or directory के रूप में एक त्रुटि देगा।

कंसोल दिखाता है: File Renamed!, क्योंकि आपने इसे बिना किसी शर्त के अभी-अभी प्रिंट किया है।

इस परिदृश्य को संभालने के लिए, या तो संबंधित सिंक विधियों का उपयोग करें जैसे:

const fs = require(`fs`);

fs.appendFileSync(`mynewfile1.txt`, `Hello content!`);
console.log(`Saved!`);

fs.renameSync(`mynewfile1.txt`, `myrenamedfile.txt`);
console.log(`File Renamed!`);

या async/प्रतीक्षा का उपयोग करें:

const fs = require(`fs`);
const util = require('util');

const appendAndRename = async () => {
    try {
        await util.promisify(fs.appendFile)(`mynewfile1.txt`, `Hello content!`);
        console.log(`Saved!`);

        await util.promisify(fs.rename)(`mynewfile1.txt`, `myrenamedfile.txt`);
        console.log(`File Renamed!`);
    } catch(err) {
        console.log(err);
        throw err;
    }
}

appendAndRename();

सुनिश्चित करें कि आपके प्रतीक्षित कथन हमेशा कोशिश करें/पकड़ें ब्लॉक में लिपटे हुए हैं और तत्काल पैरेंट फ़ंक्शन async कीवर्ड के साथ घोषित किया गया है।

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

1
Mohammed Amir Ansari 6 अक्टूबर 2019, 14:37

मामले में "फ़ाइल का नाम बदला!" पहले निष्पादित किया जाता है, "सहेजा गया!" भाग mynewfile1.txt नामक एक नई फ़ाइल बनाएगा

यदि आप ऑर्डर को संरक्षित रखना चाहते हैं, तो async फ़ंक्शन में उपयोग करें:

const fs = require(`fs`);

await fs.appendFile(`mynewfile1.txt`, `Hello content!`);
console.log(`Saved!`);

await fs.rename(`mynewfile1.txt`, `myrenamedfile.txt`);
console.log(`File Renamed!`);
1
Horatiu Jeflea 6 अक्टूबर 2019, 13:53

नीचे काम कर रहे (परीक्षण) कोड स्निपेट खोजें। fs फ़ंक्शंस को प्रॉमिस करने के लिए बिल्ट-इन 'यूटिल' मॉड्यूल का इस्तेमाल किया।

    const fs = require(`fs`);
    const util = require('util');

    async function doTheOpAsync() {
        const appendFile = util.promisify(fs.appendFile);
        const rename = util.promisify(fs.rename);
        try{
            await appendFile(`mynewfile1.txt`, `Hello content!`);
            console.log(`Saved!`);
            await rename(`mynewfile1.txt`, `myrenamedfile.txt`);
            console.log(`File Renamed!`);
        }catch(ex){
            console.log(ex);
        }
    }
    doTheOpAsync();
1
Sudhakar RS 6 अक्टूबर 2019, 14:04