제 인생에도 만점이 있을까요..?
이거 재시야..잊지마
아무튼 시작한 시험! 시간제한은 없지만
어제밤 부터 계속 붙잡고 있는 미들웨어!
오늘도,, 알바 끝나고 저녁 부터 다시 시작함.
//routes/user.js
const { Router } = require('express');
const router = Router();
const users = ['철수', '영희', '지은'];
router.get('/', (req, res, next) => {
res.json(users);
});
router.get('/:name', (req, res, next) => {
const { name } = req.params;
res.json({
id: users.indexOf(name),
name,
});
});
router.get('/users', (req, res, next) => {
const { passWords } = req.query;
res.json({
id: users.indexOf(passWords),
passWords,
});
});
module.exports = router;
//index.js
// 지시사항을 참고하여 코드를 작성하세요.
const express = require('express');
const notesRouter = require('./routes/notes');
const usersRouter = require('./routes/users');
const logger = require('./middlewares/request-logger');
// const error500 = require('./middlewares/error-handler');
const error404 = require('./middlewares/not-found');
const errHandler = require('./middlewares/error-handler');
const app = express();
app.get('/', (err, req, res) => {
throw new Error('Error!');
});
app.use('/notes', notesRouter);
app.use('/users', usersRouter);
app.use(logger);
app.use(error404);
app.use(errHandler);
app.listen(8080, () => {
console.log('SERVER STARTED');
});
//middlewares/require-logger.js
// 지시사항을 참고하여 코드를 작성하세요.
const logger = (req, res, next) => {
console.log(req.method, req.path);
next();
};
module.exports = logger;
//middlewares/password-required.js
// 지시사항을 참고하여 코드를 작성하세요.
const passwords = (req, res, next) => {
let pwd = req.query;
if (pwd.length === 0) {
next(new Error('NotAuthorized');)
return;
}
if(pwd === '12345678') {
const passwd =req.get('password')
}
next();
};
module.exports = passwords;
//middlewares/error-handler.js
// 지시사항을 참고하여 코드를 작성하세요.
//오류 처리 미들웨어
const errHandler = (err, req, res, next) => {
res.status(500).send({ error: err.message });
next(err);
};
module.exports = errHandler;
//middlewares/not-found.js
// 지시사항을 참고하여 코드를 작성하세요.
//정의되지 않은 경로 미들웨어
const error404 = (req, res, next) => {
res.status(404).send({ error: 'PageNotFound' });
next(err);
};
module.exports = error404;
//notes.json
[
{ "title": "안녕하세요.", "content": "안녕히가세요." },
{ "title": "반갑습니다.", "content": "좋은 아침입니다." },
{ "title": "노트에요", "content": "읽을 수 있습니다." },
{ "title": "아무래도", "content": "좋습니다." }
]
지시사항
모든 요청에 대해 method와 path를 기록하는 requestLogger 미들웨어를 작성하고 적용합니다.
미들웨어는 ./middlewares/request-logger.js 파일에 작성합니다.
요청을 기록하는 코드는 다음과 같습니다.
console.log(req.method, req.path);
Copy
/users 경로에 비밀번호를 확인하는 미들웨어를 작성하고 적용합니다.
미들웨어는 ./middlewares/password-required.js 파일에 작성합니다.
비밀번호는 쿼리로 전달됩니다.
비밀번호는 ‘12345678’ 입니다.
비밀번호가 없는경우 오류처리 미들웨어로 오류를 전달합니다.
전달되어야 하는 오류는 new Error('NotAuthorized') 입니다.
오류처리 미들웨어를 작성하고 적용합니다.
미들웨어는 ./middlewares/error-handler.js 파일에 작성합니다.
응답은 json으로 보냅니다.
응답 http status는 500입니다.
오류에 해당하는 응답은 다음과 같습니다.
{ error: err.message }
정의되지 않은 경로를 처리하는 미들웨어를 작성하고 적용합니다.
미들웨어는 ./middlewares/not-found.js 파일에 작성합니다.
응답은 json으로 보냅니다.
응답 http status는 404입니다.
응답은 다음과 같습니다.
{ error: 'PageNotFound' }
app.use('/경로이름', 라우터객체)
app.use(미들우에ㅓ1,미들웨어2);
//logger은 기록
// path params : user /:id ex) user/1
:id를 경로로 취급한다
route handler > function(get,post.put,delete) 등에 적용된 미들웨어인데, path parameter를 사용할수 있다.
const logger= (req,res,next) =>{
console.log('request ${req.path}`};
next(); //여기서 next가 다음 미들웨어 호출하는것임!
// 다음 미들웨어
const auth = (req,res,next)=>{
if (!isAdmin(req)){
next(new Error('not authorized'));
return;
}
next();
}
app.use(()=>{
if(! (req)})
오류처리 미들웨어 (3)
app.use((err,req,res,rnext)=>{
res.sned('Error occured!')
})
// 오류처리 미들웨어 설정 예시
next( new Error(`member not ${memberType}`));
//index.js
const express = require('express');
const notesRouter = require('./routes/notes');
const usersRouter = require('./routes/users');
const logger = require('./middlewares/request-logger');
const passwords = require('./middlewares/password-required');
const error404 = require('./middlewares/not-found');
const errHandler = require('./middlewares/error-handler');
const app = express();
app.use('/notes', notesRouter);
app.use('/users', passwords, usersRouter);
app.use((err, req, res, next) => {
throw new Error('Error!');
});
//password-requires.js
// 지시사항을 참고하여 코드를 작성하세요.
const passwords = (req, res, next) => {
const { password } = req.query;
//const pwd = req.get('password');
if (password !== '12345678' || password.length < 1) {
next(new Error('NotAuthorized'));
return;
}
next();
};
module.exports = passwords;
//error-handelr.js
// 지시사항을 참고하여 코드를 작성하세요.
//오류 처리 미들웨어
const errHandler = (err, req, res, next) => {
if (res.headersSent) {
return next();
}
res.status(500).send({ error: err.message });
//next();
};
module.exports = errHandler;
//routes/user.js
router.get('/users', (req, res, next) => {
const { passwords } = req.query;
res.json({
passwords: users.indexOf(passwords),
// passwords,
});
});
응답의 기록을 시작한 후에 오류가 있는 next()를 호출하는 경우(예: 응답을 클라이언트로 스트리밍하는 중에 오류가 발생하는 경우)
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at new NodeError (node:internal/errors:371:5)
at ServerResponse.setHeader (node:_http_outgoing:576:11)
at ServerResponse.header (/elice/node_modules/express/lib/response.js:767:10)
at ServerResponse.send (/elice/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/elice/node_modules/express/lib/response.js:267:15)
at ServerResponse.send (/elice/node_modules/express/lib/response.js:158:21)
at errHandler (/elice/project_file/middlewares/error-handler.js:8:19)
at Layer.handle_error (/elice/node_modules/express/lib/router/layer.js:71:5)
at trim_prefix (/elice/node_modules/express/lib/router/index.js:315:13)
at /elice/node_modules/express/lib/router/index.js:284:7
GET /
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at new NodeError (node:internal/errors:371:5)
at ServerResponse.setHeader (node:_http_outgoing:576:11)
at ServerResponse.header (/elice/node_modules/express/lib/response.js:767:10)
at ServerResponse.send (/elice/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/elice/node_modules/express/lib/response.js:267:15)
at ServerResponse.send (/elice/node_modules/express/lib/response.js:158:21)
at errHandler (/elice/project_file/middlewares/error-handler.js:8:19)
at Layer.handle_error (/elice/node_modules/express/lib/router/layer.js:71:5)
at trim_prefix (/elice/node_modules/express/lib/router/index.js:315:13)
at /elice/node_modules/express/lib/router/index.js:284:7
function errorHandler(err, req, res, next) {
if (res.headersSent) { //위 내용을 추가하면 됌.
return next(err); // err 변수를 인식을 잘 못함 다음 미들웨어로 전달되게 그냥 삭제함
}
res.status(500);
res.render('error', { error: err });
}
...😇
//app.js
app.all('*', (req, res, next) => {
throw new errHandler('Error!');
})
결과는?
와! 신난다 인식된다!
//모든 오류를 처리하는(catch-all)” errorHandler 함수는 다음과 같이 구현될 수 있습니다.
function errorHandler(err, req, res, next) {
res.status(500);
res.render('error', { error: err });
};
app.all('/', (err, req, res, next) => {
throw new errHandler();
});
// 2 방법 이것도 가능
//app.all('*', (err, req, res, next) => {
// throw new errHandler();
// });
// 3 all 대신 get 써도 가능
app.use(logger);
app.use(error404);
app.use(errHandler);
app.listen(8080, () => {
console.log('SERVER STARTED');
});
vs
app.all('*'....)
/ == /about == /usr/123
다 받아들인다고 함.app.use( "/book" , middleware);
// will match /book
// will match /book/author
// will match /book/subject
app.all( "/book" , handler);
// will match /book
// won't match /book/author
// won't match /book/subject
app.all( "/book/*" , handler);
// won't match /book
// will match /book/author
// will match /book/subject
👏👏👏