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

eimct9ow  于 2023-05-06  发布在  Node.js
关注(0)|答案(4)|浏览(214)

我对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
我错过了什么?救命啊!

qxsslcnc

qxsslcnc1#

下面的代码片段使用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. */
toe95027

toe950272#

或者简单地如下:

const fs = require('fs');
const doAsync = require('doasync');

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

nwwlzxa73#

一个非常简单的方法:

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

xa9qqrwz4#

正如你的问题下面的注解所述,node是异步的--这意味着当你的第二个console.log函数被调用时,你的函数还没有完成执行。
如果在阅读文件后将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的异步性质,您将遇到很多问题。
This similar stackoverflow answer更详细地介绍了其他可用的替代方案。

相关问题