@opengis/fastify-table
Version:
core-plugins
76 lines (75 loc) • 2.85 kB
JavaScript
import errorMessage from "./errorMessage.js";
import logger from "./getLogger.js";
import pgClients from "../pg/pgClients.js";
// avoid process exit with exception on network changes: disconnect from db, internet altogether etc
process.on("uncaughtException", (err) => {
if (err.message === "Connection terminated unexpectedly" ||
err.code === "ECONNRESET") {
logger.file("pg", { error: err.toString() });
console.warn("⚠️ Ignored pg connection drop:", err.toString());
return;
}
logger.file("uncaughtException", { error: err.toString(), stack: err.stack });
// throw err; // keep normal behavior
});
// avoid process exit with rejection during client connect at process start
process.on("unhandledRejection", (err) => {
if ([
"Client was closed and is not queryable",
"Connection terminated due to connection timeout",
].includes(err.message)) {
logger.file("pg", { error: err.message });
console.warn("⚠️ Ignored pg connection timeout / close:", err.toString());
return;
}
if (err.message === "Connection is closed." ||
err.message.includes("maxRetriesPerRequest")) {
logger.file("redis", { error: err.message });
console.warn("⚠️ Ignored redis connection close:", err.toString());
return;
}
if (err.code === "ERR_HTTP_HEADERS_SENT") {
logger.file("fastify", { error: err.code, stack: err.stack });
console.warn("Ignored fastify reply sent exception:", err.toString());
return;
}
logger.file("unhandledRejection", {
error: err.toString(),
stack: err.stack,
});
throw err;
});
async function plugin(fastify) {
fastify.addHook("onResponse", async (req, reply) => {
if (reply?.statusCode && reply.statusCode >= 400) {
logger.metrics(`error-count:${reply.statusCode}`);
}
});
fastify.setErrorHandler(async (error, request, reply) => {
// validation not error
if (error.validation) {
request.log.warn(request, {
code: error?.code,
status: 422,
error: error.toString(),
});
return reply.status(422).send({ error: error.toString(), code: 422 });
}
// logger
request.log.error(error, request);
console.error({
msg: error.message,
where: error.where,
stack: error.stack,
});
// errorMessage
const msg = errorMessage(error);
return reply
.status(error.statusCode || 500)
.send({ error: msg, code: error.statusCode || 500 });
});
fastify.addHook("onListen", async () => {
logger.file("init", { db: pgClients.client?.options?.database });
});
}
export default plugin;