express의 middleware 기능을 이용하여 좀더 코드를 깔끔하게 response 형식을 공통화화고, index.ts에서 middleware 기능을 따로 분리하여 각각 기능별로 관리하도록 하겠습니다.
response에서 responseCode 200으로 성공인 경우에는 공통처리를 하고 다음 미들웨어로 넘어가지 않고 종료하도록 처리합니다.
import { NextFunction, Request, Response } from 'express';
const responseFilter = (req: Request, res: Response, next: NextFunction) => {
console.log('[ responseFilter ]=============');
console.log(res.statusCode);
if (res.statusCode == 200) {
const result = res.locals.apiResponse;
res.status(200).send({
status: 200,
success: true,
data: result
});
} else {
next();
}
};
export default responseFilter;
기존에 index.ts의 app.use안에 작성한 request 요청시마다 선 실행되었던 코드를 분리하여 따로 작성합니다.
import { NextFunction, Request, Response } from 'express';
const commonLog = (req: Request, res: Response, next: NextFunction) => {
console.log('[ commonLog ]==================');
console.log('requestURL: ' + req.url);
console.log('requestMethod: ' + req.method);
if (req.method !== 'GET') {
console.log('requestBody: ' + JSON.stringify(req.body));
}
next();
};
export default commonLog;
기존에 index.ts의 app.use안에 작성한 error handling 관련 소스를 분리하여 따로 작성합니다.
import { NextFunction, Request, Response } from 'express';
const commonError = (
err: { message: string },
req: Request,
res: Response,
next: NextFunction
) => {
console.error('[ commonError ]================');
console.error(`[errMessage]: ${err.message}`);
res.status(500).send({
status: 500,
success: false,
message: 'Server Error',
error: err.message
});
};
export default commonError;
middleware는 위치에 따라 적용 순서가 변경되므로 순서에 유의하여 아래와 같이 작성합니다.
import commonLog from './middleware/commonLog';
import responseFilter from './middleware/responseFilter';
import commonError from './middleware/commonError';
// middleware - log
app.use(commonLog);
// ETH api
const router = express.Router();
router.use('/eth', ethRouter);
app.use('/api', router);
// middleware - response format
app.use(responseFilter);
// error handling
app.use(commonError);
Reference
https://expressjs.com/en/guide/writing-middleware.html
https://www.geeksforgeeks.org/how-to-intercept-response-send-response-json-in-express-js/