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

时间:2014-02-23 03:33:08

标签: node.js

我是NodeJ的新手。我正在尝试将文件读入变量。 这是我的代码。

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

我缺少什么?求救!

3 个答案:

答案 0 :(得分:5)

如您问题中的评论中所述,节点是异步的 - 意味着在调用第二个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);
});

即使这会解决您的问题,但如果不了解节点的异步性质,您将会遇到很多问题。

This similar stackoverflow answer详细介绍了其他替代方案的可用性。

答案 1 :(得分:1)

或如下所述:

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

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

答案 2 :(得分:0)

以下代码片段使用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);

}

使用同步任务还有另一种简单的方法。由于这是一个同步任务,因此您无需担心其执行情况。与异步任务不同,该程序仅在执行当前行后移至下一行。 以下链接提供了更清晰,详细的答案:

Get data from 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. */