Nodejs - Asynchronous File Operations with Try-Catch

Handle Situation When File Does Not Exist in Directory

Performing a file reading operation to check whether or not a file exists before operating might cause a race condition as stated in the Nodejs section on fs.stat:

“Using fs.stat() to check for the existence of a file before calling fs.open(), fs.readFile() or fs.writeFile() is not recommended. Instead, user code should open/read/write the file directly and handle the error raised if the file is not available.”

In order to make it safer when using an asynchronous file read operation, a try-catch block should always wrap the async file operation because it will allow one to handle the situation when a file is indeed non-existent.

Here is an example where the library ‘co’ and ‘fs-extra-promises’ are used to show safe operation with the try-catch block on async operations:

Generators and Try-catch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import { statAsync } from 'fs-extra-promise';
import co from 'co';

co(function* fileCheck() {
yield co.wrap(function* () {
try {
//statAsync is the promise version of fs.stat
const fileExists = yield statAsync('a/path/that/does/not/exists');

//Check if is a file type of folder type
//Do stuff when the path does exist
//fileExists.isFile() || fileExists.isDirectory()
} catch (e) {

//Errors out here because the path stated does not exists

//Do stuff here where there is an error
///...
}
};
});