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

日志未定义,为什么?


当前回答

这里实际上有一个同步函数:

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(文件名,(编码))

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

如果指定了编码,则此函数返回一个字符串。否则返回一个缓冲区。

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

其他回答

使用内置的promisify库(Node 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);
  }
}

如前所述,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);

这就是为什么当您记录内容时,内容仍然是空的。Node尚未检索到文件的内容。

这可以通过在回调函数中移动console.log(content)来解决,就在content = data;之后。这样,您将在节点读取文件以及内容获得值之后看到日志。

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

粗略地说,你在处理本质上是异步的node.js。

当我们谈论异步时,我们谈论的是在处理其他事情的同时处理信息或数据。请注意,它不是平行的同义词。

你的代码:

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

在您的示例中,它基本上首先执行console.log部分,因此变量“content”未定义。

如果你真的想要输出,可以这样做:

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

这是异步的。这很难适应,但事实就是这样。 同样,这是对异步的粗略但快速的解释。

同步和异步文件读取方式:

//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。