Open shravan20 opened 1 year ago
` 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'}); }
})`
Don''t worry i'm working on same. A package named exhancer you can check here... https://github.com/kisshan13/exhancer.js
Could you please provide some code sample so it helps people what is expected?
@UlisesGascon can we please add awaiting more info label here?
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.
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",
};
}
}
}
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
})
}
}
app.use(errorHandler([mongoError]))
So this is the basic idea which i have . : )
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?
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.