How to read the content of files synchronously in Node.js?

40,297

Solution 1

You need to use readFileSync, your method is still reading the files asynchronously, which can result in printing the contents out of order depending on when the callback happens for each read.

var fs = require('fs'),
    files = fs.readdirSync(__dirname + '/files/');

files.forEach(function(file) {
  var contents = fs.readFileSync(__dirname + '/files/' + file, 'utf8');
  console.log(contents);
})

Solution 2

That's because you read the file asynchronously. Try:

#! /usr/bin/env node

var fs = require('fs'),
    files = fs.readdirSync(__dirname + '/files/'),

files.forEach(function(file) {
  var data = fs.readFileSync(__dirname + '/files/' + file, 'utf8');
  console.log(data);
});

NodeJS Documentation for 'fs.readFileSync()'

Solution 3

Have you seen readFileSync? I think that could be your new friend.

Share:
40,297
alexchenco
Author by

alexchenco

Programmer from Taiwan

Updated on June 08, 2020

Comments

  • alexchenco
    alexchenco about 4 years

    This is what I have:

    #! /usr/bin/env node
    
    var fs = require('fs'),
        files = fs.readdirSync(__dirname + '/files/'),
    
    files.forEach(function(file) {
      fs.readFile(__dirname + '/files/' + file, 'utf8', function (error, data) {
        console.log(data)
      })
    })
    

    Even though I'm using readdirSync the output is still asynchronous:

    alex@alex-K43U:~/node/readFiles$ node index.js 
    foo 1
    
    foo 3
    
    foo 2
    

    How to modify the code so the output becomes synchronous?

    alex@alex-K43U:~/node/readFiles$ node index.js 
    foo 1
    
    foo 2
    
    foo 3