spawn app crashed : 에러 메시지 없는 에러 잡기
spawn app crashed 에러 내용
node express에서는 크게 동기 에러와 비동기 에러가 있습니다.
이는 다음과 같이 각각 error handler와 wrapping을 통해 잡을 수 있습니다.
...
app.use(handlingError);
...
export const handlingError = (err, req, res, next) => {
let httpCode = StatusCodes.INTERNAL_SERVER_ERROR;
let data = {
success: false,
data: {},
error: err.name,
message: err.message,
detail: err.stack,
};
logger.error(err.stack);
res.status(httpCode).json(data);
};
export function errorHandler(cb) {
return function (req, res, next) {
cb(req, res, next).catch(next); // promise라서 .catch 가능
};
}
export function responseHandler(service) {
return errorHandler(async (req, res, next) => {
const result = await service(req, res, next);
if (req.sendErrorWithoutLog != true) {
res.status(StatusCodes.OK).json({
success: true,
data: result ?? {},
error: "",
errorDetails: [],
message: "",
});
}
});
}
createLectureRoute.post(
"/",
responseHandler(async (req) => {
const { lecturer, title, semester } = req.body;
console.log(req.body);
// 유효성 검증 , id..
return await createLecture({ lecturer, title, semester });
})
);
그러나 이로서는 잡을수 없는 에러도 있습니다.
spawn app crashed 에러 원인
spawn으로 생성된 다른(자식) 프로세스로 부터 기인한 에러이기 때문에 일반적인 에러 파이프라인에 속하지 않기 때문입니다.
spawn app crashed 해결 방법
이는 다음과 같이 자식 프로세스가 보내는 signal이나 event로 잡을 수 있습니다.
process.on("uncaughtException", (exception) => {
logger.error(exception.stack);
});
process.once("SIGUSR2", function () {
gracefulShutdown(function () {
process.kill(process.pid, "SIGUSR2");
});
});
참고 자료
댓글