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