Home > Software design >  Node.js readFile async callback UnhandledPromiseRejectionWarning
Node.js readFile async callback UnhandledPromiseRejectionWarning

Time:09-09

I am trying to supply an async function to node.js's fs.readFile callback, but I am not too sure how to handle the errors thrown by the callback. Normally, with non-async callback, you would do:

// error is handled

fs.readFile('/file_does_not_exist.txt', 'utf8', (err, data) => {
  if (err) throw err
  // do things here
})

And if a readFile error occurs, it is handled properly. But as soon as I use an async function as a callback:

// UnhandledPromiseRejectionWarning

fs.readFile('/file_does_not_exist.txt', 'utf8', async (err, data) => {
  if (err) throw err
  // await for things here
})

Then it throws UnhandledPromiseRejectionWarning when a readFile error occurs. How would you try to handle the err in this scenario? I have tried try catch in the body of the callback, but it doesn't work. The only other solution is to wrap the async function inside another function.

CodePudding user response:

fs.readFile('/file_does_not_exist.txt', 'utf8', async (err, data) => {
         //if (err) throw err
        /* replace it to */ if (err){
                //handle error here
         }else{
                // await for things here
        }
})

CodePudding user response:

It's expected that you get an UnhandledPromiseRejectionWarning error, because throwing an error isn't the same as handling it.

If your goal is to exit the process:

if (err) {
  process.exit(1);
}

If you want to continue running the program but somehow handle the error upstream, you'll end up mixing callbacks and promises, which typically leads to convoluted code.

Instead, I would suggest using fs/promises, the Promise-based implementation of fs:

const fs = require('node:fs/promises');
… 
async function readFile() {
  try {
    const data = await fs.readFile('/file_does_not_exist.txt', 'utf8');
    // process file data
  } catch(e) {
    console.error('caught error reading file', e);
    // here you can cleanly exit the process or re-throw `e` to properly handle it upstream
  }
}
  • Related