从fs.readFile获取数据

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

日志undefined ,为什么?

为了详细说明@Raynos说了什么,你定义的函数是一个asynchronouscallback。 它不会立即执行,而是在文件加载完成时执行。 当您调用readFile时,控制立即返回并执行下一行代码。 所以当你调用console.log时,你的callback还没有被调用,并且这个内容还没有被设置。 欢迎来到asynchronous编程。

示例方法

 var content; // First I want to read the file fs.readFile('./Index.html', function read(err, data) { if (err) { throw err; } content = data; // Invoke the next step here however you like console.log(content); // Put all of the code here (not the best solution) processFile(); // Or put the next step in a function and invoke it }); function processFile() { console.log(content); } 

或者更好的是,正如Raynos的例子所示,将你的调用包装在一个函数中,并传入你自己的callback函数。 (显然这是更好的做法)我认为把你的asynchronous调用包装在一个callback函数的习惯将节省您很多麻烦和杂乱的代码。

 function doSomething (callback) { // any async callback invokes callback with response } doSomething (function doSomethingAfter(err, result) { // process the async result }); 

实际上有一个同步function:

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

asynchronous

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

asynchronous读取文件的全部内容。 例:

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

callback传递两个参数(err,data),其中data是文件的内容。

如果没有指定编码,则返回原始缓冲区。


同步

fs.readFileSync(filename, [encoding])

fs.readFile的同步版本。 返回名为filename的文件的内容。

如果指定了编码,那么这个函数返回一个string。 否则它会返回一个缓冲区。

 var text = fs.readFileSync('test.md','utf8') console.log (text) 
 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) }) 

使用承诺与ES7

asynchronous使用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)); 

或者,你可以写在asynchronousfunction:

 async function myReadfile () { try { const file = await fs.readFile('./Index.html'); } catch (err) { console.error( err ) } }; 
 var data = fs.readFileSync('tmp/reltioconfig.json','utf8'); 

使用它来同步调用一个文件,而不将它的显示输出编码为一个缓冲区。

如上所述, fs.readFile是一个asynchronous操作。 这意味着当您告诉节点读取一个文件时,您需要考虑这需要一些时间,同时节点继续运行以下代码。 你的情况是: 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); 

这就是为什么当你login时content仍然是空的。 节点尚未检索文件的内容。

这可以通过在callback函数内移动console.log(content)来解决,在content = data; 。 这样,当节点完成读取文件和content获取值后,您将看到日志。

同步和asynchronous文件阅读方式:

 //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); 

节点作弊在read_file处可用 。

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