user2540315
user2540315

Reputation:

How to read file to variable in NodeJs?

i'm pretty new into NodeJs. And i am trying to read a file into a variable. Here is my code.

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

But every time i run the script i get undefined and undefined

What am i missing? Help please!

Upvotes: 14

Views: 52991

Answers (4)

Gilles Quénot
Gilles Quénot

Reputation: 185179

One very simple way:

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

Upvotes: 1

The following code snippet uses ReadStream. It reads your data in separated chunks, if your data file is small it will read the data in a single chunk. However this is a asynchronous task. So if you want to perform any task with your data, you need to include them within the ReadStream portion.

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

}

There is also another easy way by using synchronous task. As this is a synchronous task, you do not need to worry about its executions. The program will only move to the next line after execution of the current line unlike the asynchronous task. A more clear and detailed answer is provided in the following link:

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. */

Upvotes: 10

Ryan
Ryan

Reputation: 6517

As stated in the comments under your question, node is asynchronous - meaning that your function has not completed execution when your second console.log function is called.

If you move the log statement inside the the callback after reading the file, you should see the contents outputted:

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

Even though this will solve your immediately problem, without an understanding of the async nature of node, you're going to encounter a lot of issues.

This similar stackoverflow answer goes into more details of what other alternatives are available.

Upvotes: 11

Zuhair Taha
Zuhair Taha

Reputation: 3032

or easily as follows:

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

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

Upvotes: 6

Related Questions