Node fs module async/await

December 14, 2020

Usually when working with the Node fs module you need to decide between using the synchronous methods or the asynchronous methods with callbacks. The synchronous version could look like this:

import fs from 'fs'
const files = fs.readdirSync(path.join(process.cwd(), 'content'))

and the asynchronous version could look like this:

import fs from 'fs'
const files = fs.readdir(path.join(process.cwd(), 'content'), (err, files) => { ... }

I've always seen developers recommend using the asynchronous version for performance reasons (non-blocking), however many still reach for the synchronous version to avoid callback hell and because it's easier to reason about.

I recently learned that as of Node 12 a Promise version of the functions is available as part of the standard library. You could use this in combination with async/await for a version that is non-blocking and easy to reason about. The best of aspects of both.

import { promises as fs } from 'fs'

const files = await fs.readdir(path.join(process.cwd(), 'content'))