如何在NodeJs中将文件读取到变量中?

13

我对NodeJs还比较新,正在尝试将文件读入变量中。这是我的代码。

var fs = require("fs"),
    path = require("path"),
    util = require("util");
        var content;
        console.log(content);
        fs.readFile(path.join(__dirname,"helpers","test.txt"), 'utf8',function (err,data) {
            if (err) {
                console.log(err);
                process.exit(1);
            }
            content = util.format(data,"test","test","test");
        });
        console.log(content);

但是每次我运行这个脚本,我都会得到undefinedundefined

我错过了什么吗?请帮忙!


1
fs.readFile 是异步的(这就是为什么要使用回调函数)。要么在回调函数中完成所有操作,要么使用 var content = fs.readFileSync("filename") - Blender
3
欢迎来到异步编程的精彩世界!你不能这样做。 - SLaks
它返回一个缓冲区。如何将缓冲区转换为字符串? - user2540315
可能是从fs.readFile获取数据的重复问题。 - rofrol
从fs.readFile获取数据 - rofrol
@user2540315 在文件路径后添加 'utf8',以使其不读取缓冲文本。 - wongz
4个回答

11

如在你问题下的评论中所述,Node 是异步的,这意味着当第二个 console.log 被调用时,你的函数尚未完成执行。

如果你将日志语句移动到读取文件后的回调函数内部,则应该看到输出的内容:

var fs = require("fs"),
    path = require("path"),
    util = require("util");
var content;
console.log(content);
fs.readFile(path.join(__dirname, "helpers", "test.txt"), 'utf8', function (err, data) {
    if (err) {
        console.log(err);
        process.exit(1);
    }
    content = util.format(data, "test", "test", "test");
    console.log(content);
});

尽管这可以解决您当前的问题,但如果没有理解Node异步性质,您将会遇到很多问题。

这个类似的stackoverflow答案详细介绍了其他可用的替代方案。


9
以下代码片段使用了 ReadStream,它将数据分为多个块读取,如果数据文件较小,则只读取一个数据块。但是,这是一个异步任务。如果您想对数据执行任何任务,则需要将其包含在 ReadStream 部分中。

var fs = require('fs');

var readStream = fs.createReadStream(__dirname + '/readMe.txt', 'utf8');
/* include the file directory and file name instead of <__dirname + '/readMe.txt'> */

var content;

readStream.on('data', function(chunk){
    content = chunk;
    performTask();
    
});

function performTask(){

    console.log(content);

}

还有另一种简单的方法,可以使用同步任务。由于这是同步任务,您不需要担心其执行情况。与异步任务不同,程序将仅在当前行执行完成后才移动到下一行。

以下链接提供了更清晰和详细的答案:

获取 fs.readfile 的数据

var fs = require('fs');

var content = fs.readFileSync('readMe.txt','utf8');

/* include your file name instead of <'readMe.txt'> and make sure the file is in the same directory. */


6
或者可以简单地按照以下方式进行:
const fs = require('fs');
const doAsync = require('doasync');

doAsync(fs).readFile('./file.txt')
    .then((data) => console.log(data));

0

一种非常简单的方法:

var json = require("./file.json");
console.log(JSON.stringify(json 4, true));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接