Fs.readFile से डेटा प्राप्त करें


296
var content;
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});
console.log(content);

लॉग्स undefined, क्यों?


1
fs.readFileSync के पास फ़ाइल को पढ़ने के लिए अच्छी सुविधाएँ हैं, भले ही वह यूनिकोड utf8 प्रारूप में हो।
प्रणीत

NB fs.readFile भी कर सकते हैं कि ^ नीचे मेरा उत्तर देखें
डोमिनिक

जवाबों:


347

@Raynos ने जो कहा, उसके बारे में विस्तार से बताने के लिए, आपने जो फ़ंक्शन परिभाषित किया है वह एक अतुल्यकालिक कॉलबैक है। यह तुरंत निष्पादित नहीं करता है, बल्कि यह तब निष्पादित होता है जब फ़ाइल लोडिंग पूरी हो गई है। जब आप रीडफाइल कहते हैं, तो नियंत्रण तुरंत वापस आ जाता है और कोड की अगली पंक्ति निष्पादित होती है। इसलिए जब आप कंसोल कॉल करते हैं, तो आपका कॉलबैक अभी तक लागू नहीं किया गया है, और यह सामग्री अभी तक सेट नहीं की गई है। अतुल्यकालिक प्रोग्रामिंग में आपका स्वागत है।

उदाहरण दृष्टिकोण

const fs = require('fs');
// First I want to read the file
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    const content = data;

    // Invoke the next step here however you like
    console.log(content);   // Put all of the code here (not the best solution)
    processFile(content);   // Or put the next step in a function and invoke it
});

function processFile(content) {
    console.log(content);
}

या बेहतर अभी तक, जैसा कि रेन्नोस उदाहरण दिखाता है, अपने कॉल को एक फ़ंक्शन में लपेटें और अपने कॉलबैक में पास करें। (जाहिरा तौर पर यह बेहतर अभ्यास है) मुझे लगता है कि अपने async कॉल को फ़ंक्शन में लपेटने की आदत में आने से कॉलबैक होता है जो आपको बहुत परेशानी और गड़बड़ कोड से बचाएगा।

function doSomething (callback) {
    // any async callback invokes callback with response
}

doSomething (function doSomethingAfter(err, result) {
    // process the async result
});

2
सिंक I / O का अपना स्थान है - यदि आप एक छोटी बिल्ड सिस्टम या टूल कर रहे हैं तो यह ठीक है। बड़े सिस्टम या सर्वर ऐप पर सबसे अच्छा अभ्यास यह है कि इससे बचें।
रॉब

27
सब कुछ एक वेब सर्वर नहीं है। और सर्वर द्वारा अनुरोध लेने से पहले एक-शॉट कॉल के लिए तरीकों के सिंक संस्करणों का उपयोग करने के बारे में भयानक के बारे में भयानक कुछ भी नहीं है। नोड का उपयोग करने वाले किसी को भी वास्तव में यह समझना चाहिए कि इसका उपयोग करने से पहले क्यों। निश्चित रूप से इसके बारे में रेंट-ब्लॉगिंग से पहले।
एरिक रेपेन


7
आपको 'utf8'अतिरिक्त पैरामीटर के रूप में फ़ाइल नाम के बाद शामिल करना होगा, अन्यथा यह सिर्फ एक बफर लौटाएगा। देखें: stackoverflow.com/questions/9168737/…
डॉलरअक्षय

252

इसके लिए वास्तव में एक सिंक्रोनस फ़ंक्शन है:

http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding

अतुल्यकालिक

fs.readFile(filename, [encoding], [callback])

एसिंक्रोनस रूप से किसी फ़ाइल की संपूर्ण सामग्री को पढ़ता है। उदाहरण:

fs.readFile('/etc/passwd', function (err, data) {
  if (err) throw err;
  console.log(data);
});

कॉलबैक दो तर्कों (त्रुटिपूर्ण, डेटा) को पारित किया जाता है, जहाँ डेटा फ़ाइल की सामग्री है।

यदि कोई एन्कोडिंग निर्दिष्ट नहीं है, तो कच्चे बफर वापस आ गया है।


तुल्यकालिक

fs.readFileSync(filename, [encoding])

Fs.readFile का तुल्यकालिक संस्करण। फ़ाइल नाम की सामग्री लौटाता है।

यदि एन्कोडिंग निर्दिष्ट है, तो यह फ़ंक्शन एक स्ट्रिंग लौटाता है। अन्यथा यह एक बफर लौटाता है।

var text = fs.readFileSync('test.md','utf8')
console.log (text)

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

12
इसका अनुभव मुझे हाल ही में हुआ था। मान लीजिए कि हमारा बफर है dataif (Buffer.isBuffer( data){ result = data.toString('utf8'); }अब हमने बफर को पठनीय पाठ में बदल दिया है। यह एक प्लेटेक्स्ट फ़ाइल पढ़ने या प्रारूप प्रकारों के खिलाफ फ़ाइल का परीक्षण करने के लिए अच्छा है। मैं यह देखने के लिए एक कोशिश कर सकता / पकड़ सकता हूँ कि क्या यह JSON फ़ाइल है; लेकिन केवल बफर के बाद पाठ में परिवर्तित हो जाता है। अधिक जानकारी के लिए यहां देखें: nodejs.org/api/buffer.html
लोगान

जहाँ तक मुझे पता है कि बफ़र्स ऑक्टेट स्ट्रीम हैं, और डेटा "टुकड़ा द्वारा टुकड़ा" भेजने के लिए अच्छा है। आपने देखा होगा कि बफर कुछ इस तरह है AF 42 F1। क्लाइंट-सर्वर-क्लाइंट संचार के लिए बहुत व्यावहारिक है।
लोगन

113
function readContent(callback) {
    fs.readFile("./Index.html", function (err, content) {
        if (err) return callback(err)
        callback(null, content)
    })
}

readContent(function (err, content) {
    console.log(content)
})

6
बहुत बहुत धन्यवाद, अगर मेरे 15 अंक थे, तो मैं आपका जवाब दूंगा :)
karaxuna

नमस्ते, आपके कोड की पहली पंक्ति में function readContent(callback), callbackएक आरक्षित शब्द है? मेरा मतलब है, क्या यह आपके कस्टम कार्यों के लिए कॉलबैक को लागू करने का मानक तरीका है? मैंने अभी नोड सीखना शुरू किया है।
अमल एंटनी

3
हाय अमल कॉलबैक बस उनके कार्य के लिए दिया गया तर्क है, यह eventया cआप जैसा कोई भी नाम हो सकता है - यह जावास्क्रिप्ट में एक आरक्षित शब्द नहीं है, और मुझे लगता है कि यह Node.js. तक समान होगा।
RealDeal_EE'18

readContent(function (err, content)पैरामीटर के रूप में फ़ंक्शन का उपयोग करते समय मुझे एक सिंटैक्स त्रुटि देता है।
मॉन्स्टो

66

ES7 के साथ वादे का उपयोग करना

Mz / fs के साथ अतुल्यकालिक उपयोग

mzमॉड्यूल कोर नोड पुस्तकालय की promisified संस्करण प्रदान करता है। उनका उपयोग करना सरल है। पहले पुस्तकालय स्थापित करें ...

npm install mz

फिर...

const fs = require('mz/fs');
fs.readFile('./Index.html').then(contents => console.log(contents))
  .catch(err => console.error(err));

वैकल्पिक रूप से आप उन्हें अतुल्यकालिक कार्यों में लिख सकते हैं:

async function myReadfile () {
  try {
    const file = await fs.readFile('./Index.html');
  }
  catch (err) { console.error( err ) }
};

6
यह भविष्य है और सभी के द्वारा अत्यधिक
उत्थान

2
दिलचस्प लग रहा है। एक टाइपो: 'कंसोल.रोर (कैच)' को 'कंसोल.रोर (इरेट)' 'आई प्रिस् यू) होना चाहिए।
दार्वाक

2
यदि आप एक अतिरिक्त पैकेज नहीं जोड़ना चाहते हैं, तो नीचे दिए गए @doctorlee के समाधान का प्रयास करें
rahuljain1311

18
var data = fs.readFileSync('tmp/reltioconfig.json','utf8');

किसी फ़ाइल को एक बफर के रूप में आउटपुट दिखाने के बिना, समकालिक रूप से कॉल करने के लिए इसका उपयोग करें।


2
सुंदर छपाई के लिए कोड ब्लॉक करने से पहले आपको एक खाली लाइन की जरूरत होती है।
royhowie

संक्षिप्त और सबसे अच्छा!
हीरा

12

यह लाइन काम करेगी,

const content = fs.readFileSync('./Index.html', 'utf8');
console.log(content);

1
7 साल बीत गए :) fs.readFileSyncसिंक विधि है, इसलिए awaitवहां की कोई आवश्यकता नहीं है । जब आप सिंक कोड के समान सिंटैक्स के साथ async कोड लिखना चाहते हैं, तो Await वादों के साथ उपयोगी है ( nodejs.org/api/fs.html#fs_fs_promises_api )।
करकुन जना 19

@ केराक्सुना, हाँ। हटा दिया। मैं आज इस मामले में आता हूं और मैंने उपरोक्त कोड का उपयोग करके हल किया।
अर्विन

1
यह सबसे सरल उत्तर है। यदि आपको async की आवश्यकता नहीं है, तो दुनिया में आप async संस्करण को कॉलबैक, async / प्रतीक्षा, आदि के साथ क्यों मिलाएँगे? जाने का यह रास्ता है।
बतख के मास्टर

8
const fs = require('fs')
function readDemo1(file1) {
    return new Promise(function (resolve, reject) {
        fs.readFile(file1, 'utf8', function (err, dataDemo1) {
            if (err)
                reject(err);
            else
                resolve(dataDemo1);
        });
    });
}
async function copyFile() {

    try {
        let dataDemo1 = await readDemo1('url')
        dataDemo1 += '\n' +  await readDemo1('url')

        await writeDemo2(dataDemo1)
        console.log(dataDemo1)
    } catch (error) {
        console.error(error);
    }
}
copyFile();

function writeDemo2(dataDemo1) {
    return new Promise(function(resolve, reject) {
      fs.writeFile('text.txt', dataDemo1, 'utf8', function(err) {
        if (err)
          reject(err);
        else
          resolve("Promise Success!");
      });
    });
  }

5
कृपया अपने उत्तर में कोड न डालें ... स्पष्ट करें कि यह अलग क्यों है और यह समस्या को हल कैसे करता है।
Studocwho

@doctorlee यह वास्तव में मेरे लिए काम करता है, बिना किसी बाहरी पुस्तकालय के। व्याख्या सुनिश्चित करने के लिए आवश्यक है।
आशुतोष चमोली

7

सिंक और async फ़ाइल पढ़ने का तरीका:

//fs module to read file in sync and async way

var fs = require('fs'),
    filePath = './sample_files/sample_css.css';

// this for async way
/*fs.readFile(filePath, 'utf8', function (err, data) {
    if (err) throw err;
    console.log(data);
});*/

//this is sync way
var css = fs.readFileSync(filePath, 'utf8');
console.log(css);

Node Cheat read_file पर उपलब्ध है ।


7

जैसा कि कहा गया है, fs.readFileएक अतुल्यकालिक क्रिया है। इसका मतलब है कि जब आप किसी फ़ाइल को पढ़ने के लिए नोड से कहते हैं, तो आपको यह विचार करने की आवश्यकता है कि इसमें कुछ समय लगेगा, और इस बीच, नोड ने निम्न कोड को चलाना जारी रखा। आपके मामले में यह है console.log(content);:।

यह लंबी यात्रा के लिए अपने कोड का कुछ हिस्सा भेजने जैसा है (जैसे बड़ी फाइल पढ़ना)।

उन टिप्पणियों पर एक नज़र डालें जो मैंने लिखी हैं:

var content;

// node, go fetch this file. when you come back, please run this "read" callback function
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});

// in the meantime, please continue and run this console.log
console.log(content);

इसीलिए contentजब आप इसे लॉग करते हैं तब भी खाली होता है। नोड ने अभी तक फ़ाइल की सामग्री को पुनर्प्राप्त नहीं किया है।

इसे console.log(content)कॉलबैक फ़ंक्शन के अंदर ले जाकर हल किया जा सकता है , ठीक इसके बाद content = data;। इस तरह आप लॉग देखेंगे जब नोड फ़ाइल को पढ़ने के बाद किया contentजाता है और उसके बाद एक मान मिलता है।


6

इन पुराने कॉलबैक फ़ंक्शंस को अधिक सुरुचिपूर्ण बनाने के लिए अंतर्निहित लाइब्रेरी (नोड 8+) का उपयोग करें।

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

const readFile = util.promisify(fs.readFile);

async function doStuff() {
  try {
    const content = await readFile(filePath, 'utf8');
    console.log(content);
  } catch (e) {
    console.error(e);
  }
}

एकल पंक्ति में हो सकता है const doStuff = async (filePath) => fs.readFileSync(filePath, 'utf8');, उपयोग की कोई आवश्यकता नहीं है। लपेटो को छोटा करें।
रब

1
सिंक संस्करण का उपयोग नहीं करना इस का बिंदु है, और आपको इसे कॉल करने में त्रुटियों को संभालना चाहिए
डोमिनिक


2
var content;
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});
console.log(content);

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

new Promise((resolve,reject)=>{
    fs.readFile('./index.html','utf-8',(err, data)=>{
        if (err) {
            reject(err); // in the case of error, control flow goes to the catch block with the error occured.
        }
        else{
            resolve(data);  // in the case of success, control flow goes to the then block with the content of the file.
        }
    });
})
.then((data)=>{
    console.log(data); // use your content of the file here (in this then).    
})
.catch((err)=>{
    throw err; //  handle error here.
})

2

निम्नलिखित समारोह asyncरैप या वादा thenश्रृंखला के लिए काम करेगा

const readFileAsync =  async (path) => fs.readFileSync(path, 'utf8');

1

आप फ़ाइल को पढ़ सकते हैं

var readMyFile = function(path, cb) {
      fs.readFile(path, 'utf8', function(err, content) {
        if (err) return cb(err, null);
        cb(null, content);
      });
    };

आप को जोड़ने पर फाइल करने के लिए लिख सकते हैं,

var createMyFile = (path, data, cb) => {
  fs.writeFile(path, data, function(err) {
    if (err) return console.error(err);
    cb();
  });
};

और यहां तक ​​कि एक साथ चेन

var readFileAndConvertToSentence = function(path, callback) {
  readMyFile(path, function(err, content) {
    if (err) {
      callback(err, null);
    } else {
      var sentence = content.split('\n').join(' ');
      callback(null, sentence);
    }
  });
};

1

मोटे तौर पर इसे लगाने के लिए, आप नोड के साथ काम कर रहे हैं। जेएस जो प्रकृति में अतुल्यकालिक है।

जब हम async के बारे में बात करते हैं, तो हम किसी अन्य चीज़ से निपटने के दौरान जानकारी या डेटा को संसाधित करने या संसाधित करने के बारे में बात कर रहे हैं। यह समानांतर का पर्याय नहीं है, कृपया याद दिलाया जाए।

तुम्हारा कोड:

var content;
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});
console.log(content);

आपके नमूने के साथ, यह मूल रूप से कंसोल.लॉग को पहले करता है, इस प्रकार परिवर्तनशील 'सामग्री' अपरिभाषित है।

यदि आप वास्तव में आउटपुट चाहते हैं, तो इसके बजाय कुछ ऐसा करें:

var content;
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
    console.log(content);
});

यह अतुल्यकालिक है। यह करने के लिए इस्तेमाल किया जाना मुश्किल होगा, लेकिन यह वही है जो यह है। फिर से, यह एक असभ्य लेकिन तेजी से स्पष्टीकरण है कि async क्या है।

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