Node.js
In this tutorial we will learn to read file in Node.js using fs module.
fs
The fs module helps in interacting with the file system.
All the File System operations are available in synchronous, callback and promise-based forms.
To read the file synchronously we use the readFileSync method.
readFileSync
It takes two parameters.
For encoding we can take value like utf8.
encoding
The flag takes value like r, r+. Default is r which is to open the file for reading. An exception occurs if file does not exists.
flag
r
r+
In the following example we are trying to read the content of example.txt file using its full path. Also, the encoding is set to utf8.
example.txt
utf8
const fs = require('fs'); console.log('Start reading...'); const data = fs.readFileSync('/Users/yusufshakeel/node-project/example.txt', { encoding: 'utf8' }); console.log('Content:'); console.log(data); console.log('Done reading!');
The above program will console log the content of the example.txt file.
Output:
Start reading... Content: Hello World Done reading!
We can wrap the read logic inside try-catch block to handle error if it occurs.
The following code will throw error as the file does not exists.
const fs = require('fs'); console.log('Start reading...'); try { const data = fs.readFileSync('/Users/yusufshakeel/node-project/not-found.txt', { encoding: 'utf8' }); console.log('Content:'); console.log(data); console.log('Done reading!'); } catch (e) { console.log('ERROR!'); console.log(e.message); }
Start reading... ERROR! ENOENT: no such file or directory, open '/Users/yusufshakeel/node-project/not-found.txt'
ENOENT is abbreviation of Error NO ENTry.
The readFilSync will block the thread. Better to use readFile as it is non blocking.
readFilSync
readFile
To read file asynchronously we use the readFile method.
It takes three parameters.
In the following example we are reading the content of a file like we did earlier.
const fs = require('fs'); console.log('Start reading...'); fs.readFile('/Users/yusufshakeel/node-project/example.txt', 'utf8', (err, data) => { if (err) { console.log('ERROR!'); console.log(err.message); } else { console.log('Content:'); console.log(data); } }); console.log('Done reading!');
In the above example we are reading content of file example.txt and in utf8 encoding. The err will hold the error if there is any. And data will hold the content of the file.
err
data
Start reading... Done reading! Content: Hello World
Since readFile is async, the content will get printed later and 'Done reading!' will be printed first.
In the above code we are using ES6 arrow function syntax.
If the file does not exists then we will get error.
const fs = require('fs'); console.log('Start reading...'); fs.readFile('/Users/yusufshakeel/node-project/not-found.txt', 'utf8', (err, data) => { if (err) { console.log('ERROR!'); console.log(err.message); } else { console.log('Content:'); console.log(data); } }); console.log('Done reading!');
Start reading... Done reading! ERROR! ENOENT: no such file or directory, open '/Users/yusufshakeel/node-project/not-found.txt'
The fs.promises API provides async file system methods that returns Promise object rather than callbacks.
fs.promises
In this case we use .then to handle data when promise gets resolved and .catch to handle error when promise gets rejected.
.then
.catch
const fs = require('fs').promises; console.log('Start reading...'); fs.readFile('/Users/yusufshakeel/node-project/example.txt', 'utf8') .then(data => { console.log('Content:'); console.log(data); }) .catch(e => { console.log('ERROR!'); console.log(e.message); }); console.log('Done reading!');
The above code will print the following output.
So, in the above code we read the content of the file example.txt.
When the promise resolves the .then part gets executed. The data parameter holds the content of the file which we then console log.
If the promise gets rejected then the .catch part gets executed. The e parameter holds the error and we print that out.
e