Home > Software engineering >  Throw await syntax in Nodejs async express handler is not working
Throw await syntax in Nodejs async express handler is not working

Time:08-31

const express = require("express");
const expressAsyncHandler = require("express-async-handler");

const app = express();

const f = async () => {
  return false;
};

app.get(
  "/",
  expressAsyncHandler(async () => {
    throw await f();
  }),
  () => {
    console.log("the bug!");
  }
);

app.use((err, req, res, next) => {
  console.log("caught!", err);
});

app.listen(4000, () => console.log("listening on port 4000..."));


Expected output on the console:

"caught!".

output:

the bug!.

question: Why? Is it a bug in async-express-handler package or is it a normal JavaScript behaviour? what if I want to throw await something inside? how ?

CodePudding user response:

Your problem is that you're throwing the value false. This doesn't fit into nodejs' callback conventions (and by extension, express error handling), which requires the err parameter to get a truthy value to be considered an error. A much simpler way to reproduce the issue:

app.get(
  "/",
  (req, res, next) => {
    Promise.reject(false).catch(next);
    // or even just:
    next(false);
  },
  () => {
    console.log("the bug!");
  }
);

So just don't do that! Always throw an Error, not a string, not something else, and this principle also holds for promise rejections.

  • Related