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 所说的,您定义的函数是异步回调。它不会立即执行,而是在文件加载完成后执行。当您调用 readFile 时,控制立即返回并执行下一行代码。所以当你调用console.log的时候,你的回调还没有被调用,这个内容还没有被设置。欢迎使用异步编程。
示例方法
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);
}
或者更好的是,如 Raynos 示例所示,将您的调用包装在一个函数中并传入您自己的回调。(显然这是更好的做法)我认为养成将异步调用包装在需要回调的函数中的习惯将为您节省很多麻烦和混乱的代码。
function doSomething (callback) {
// any async callback invokes callback with response
}
doSomething (function doSomethingAfter(err, result) {
// process the async result
});
实际上有一个同步功能:
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);
});
回调传递了两个参数 (err, data),其中 data 是文件的内容。
如果未指定编码,则返回原始缓冲区。
fs.readFileSync(filename, [encoding])
fs.readFile 的同步版本。返回名为 filename 的文件的内容。
如果指定了编码,则此函数返回一个字符串。否则它返回一个缓冲区。
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)
})
该mz
module提供了核心节点库的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 ) }
};
var data = fs.readFileSync('tmp/reltioconfig.json','utf8');
使用它来同步调用文件,而不将其显示输出编码为缓冲区。