Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extension to add Global Error Handler/Response Handler #5249

Open
shravan20 opened this issue Aug 26, 2023 · 5 comments
Open

Extension to add Global Error Handler/Response Handler #5249

shravan20 opened this issue Aug 26, 2023 · 5 comments

Comments

@shravan20
Copy link

Idea:

Add an option to extend a internal global error handler and response envelope wrapper.

This basically wraps the response into a wrapper and automatically takes care of the error and how's it wrapped into json.

Like wise for success responses too.

@sbrsubuvga
Copy link

sbrsubuvga commented Nov 30, 2023

` app.use(function(err,req,res,next){
if(err.name=='UnauthorizedError') {
return res.status(401).send({status:'error',msg:'Authentication failed'});
}
else{
return res.status(500).send({status:'error',msg:'Internal Server Error'});
}

})`

@kisshan13
Copy link

Don''t worry i'm working on same. A package named exhancer you can check here... https://github.com/kisshan13/exhancer.js

@IamLizu
Copy link
Member

IamLizu commented Jul 18, 2024

Could you please provide some code sample so it helps people what is expected?

@UlisesGascon can we please add awaiting more info label here?

@kisshan13
Copy link

Sure, the basic idea is to have different error handlers for specific errors. Let's say someone is using mongoose they might get duplicate entry errors or things like that or someone using zod can get validation errors. So errors like this can be easily globally managed if we somehow make different error handlers.

A sample error handler.

export default function mongoError(error) {
    if (error instanceof mongoose.mongo.MongoServerError) {
        switch (error.code) {
            case 11000:
                const alreadyExists = Object.keys(error?.keyPattern);
                return {
                    status: 400,
                    message: `${alreadyExists.join()} already exists`,
                };

            default:
                return {
                    status: 500,
                    message: "Internal server error",
                };
        }
    }
}

Making a error handler middleware

export function errorHandler(handler) {
    let errMessage = "";
    let errStatus = 0;

    return (err, req, res, next) => {
        for (let i = 0; i < handler?.length; i++) {
            const result = handler[i](err);

            if (result?.message || result?.status) {
                errMessage = result?.message
                errStatus = result?.status
                break;
            }
        }

        res.status(errStatus || err?.status || 500).send({
            status: errStatus || err?.status || 500,
            message: errMessage || err.message
        })
    }
}

Adding it to express global error handler :

app.use(errorHandler([mongoError]))

So this is the basic idea which i have . : )

@IamLizu
Copy link
Member

IamLizu commented Jul 24, 2024

Hey @kisshan13 👋

What I normally do is have map for error and handlers; with an observer, I simply extend the default global error handler that express provides and react accordingly.

Your approach looks good to me, and I understand provided code can be pseudo. However, maybe use Array.prototype.some instead of a for loop to handle the handlers more idiomatically?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants