var content;
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
console.log(content);
लॉग्स undefined
, क्यों?
var content;
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
console.log(content);
लॉग्स undefined
, क्यों?
जवाबों:
@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
});
'utf8'
अतिरिक्त पैरामीटर के रूप में फ़ाइल नाम के बाद शामिल करना होगा, अन्यथा यह सिर्फ एक बफर लौटाएगा। देखें: stackoverflow.com/questions/9168737/…
इसके लिए वास्तव में एक सिंक्रोनस फ़ंक्शन है:
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)
data
। if (Buffer.isBuffer( data){ result = data.toString('utf8'); }
अब हमने बफर को पठनीय पाठ में बदल दिया है। यह एक प्लेटेक्स्ट फ़ाइल पढ़ने या प्रारूप प्रकारों के खिलाफ फ़ाइल का परीक्षण करने के लिए अच्छा है। मैं यह देखने के लिए एक कोशिश कर सकता / पकड़ सकता हूँ कि क्या यह JSON फ़ाइल है; लेकिन केवल बफर के बाद पाठ में परिवर्तित हो जाता है। अधिक जानकारी के लिए यहां देखें: nodejs.org/api/buffer.html
AF 42 F1
। क्लाइंट-सर्वर-क्लाइंट संचार के लिए बहुत व्यावहारिक है।
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)
})
function readContent(callback)
, callback
एक आरक्षित शब्द है? मेरा मतलब है, क्या यह आपके कस्टम कार्यों के लिए कॉलबैक को लागू करने का मानक तरीका है? मैंने अभी नोड सीखना शुरू किया है।
event
या c
आप जैसा कोई भी नाम हो सकता है - यह जावास्क्रिप्ट में एक आरक्षित शब्द नहीं है, और मुझे लगता है कि यह Node.js. तक समान होगा।
readContent(function (err, content)
पैरामीटर के रूप में फ़ंक्शन का उपयोग करते समय मुझे एक सिंटैक्स त्रुटि देता है।
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 ) }
};
यह लाइन काम करेगी,
const content = fs.readFileSync('./Index.html', 'utf8');
console.log(content);
fs.readFileSync
सिंक विधि है, इसलिए await
वहां की कोई आवश्यकता नहीं है । जब आप सिंक कोड के समान सिंटैक्स के साथ async कोड लिखना चाहते हैं, तो Await वादों के साथ उपयोगी है ( nodejs.org/api/fs.html#fs_fs_promises_api )।
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!");
});
});
}
सिंक और 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 पर उपलब्ध है ।
जैसा कि कहा गया है, 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
जाता है और उसके बाद एक मान मिलता है।
इन पुराने कॉलबैक फ़ंक्शंस को अधिक सुरुचिपूर्ण बनाने के लिए अंतर्निहित लाइब्रेरी (नोड 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');
, उपयोग की कोई आवश्यकता नहीं है। लपेटो को छोटा करें।
var fs = require('fs');
var path = (process.cwd()+"\\text.txt");
fs.readFile(path , function(err,data)
{
if(err)
console.log(err)
else
console.log(data.toString());
});
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.
})
आप फ़ाइल को पढ़ सकते हैं
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);
}
});
};
मोटे तौर पर इसे लगाने के लिए, आप नोड के साथ काम कर रहे हैं। जेएस जो प्रकृति में अतुल्यकालिक है।
जब हम 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 क्या है।