nunjucks res.render('error'); 작동을 안합니다.
안녕하세요. 강사님.
현재 learn-sequelize MySQL 부분을 실습하고 있습니다.
그런데 실습 과정중 이름(UNIQUE INDEX ) 을 중복되게 생성하여 일부러 오류를 일으켰으나
error.html 페이지가 호출 되지 않고있습니다.
사용자 생성 router 부분은
router.route('/')
.get(async (req, res, next) => {
try {
const users = await User.findAll();
res.json(users);
} catch(err) {
console.error(err);
next(err);
}
})
.post(async (req, res, next) => {
try {
const user = await User.create({
name : req.body.name,
age : req.body.age,
married : req.body.married
});
console.log(user);
res.status(201).json(user); // status 201 작성됨(생성됨) 뜻
} catch(err) {
console.error(err);
next(err); // <== next(err) 로 전달하나 error.html을 호출하지 못함
}
});
입니다.
app.use((err, req, res, next) => {
res.locals.message = err.message;
res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
err.status = err?.status ?? 500;
res.status(err.status);
console.log('test'); //<== 로그는 찍힘
res.render('error');//error.html render안됨
});
res.render('error') 가 되지 않고 있습니다.
라우터 경로 테스트 결과
app.use((req, res, next) => {
const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`);
error.status = 404;
next(error);
});
라우터 경로 오류시에는 정상적으로 호출하는 것으로 보아 문제는 없는 것 같은데 원인을 찾지 못하고 있습니다.
잘 부탁드립니다.
-- 에러 로그는 다음과 같습니다. --
-- users 테이블에 중복된 이름을 입력 하였을 때 오류 내용으로 500 에러로 보아
error.html 호출이 되어야 하지만 호출이 되지 않고 있습니다.
Executing (default): INSERT INTO users (`id`,`name`,`age`,`married`,`created_at`) VALUES (DEFAULT,?,?,?,?);
Error
at Query.run (D:\nodeExer\node_exer1\learn-sequelize\node_modules\sequelize\lib\dialects\mysql\query.js:52:25)
at D:\nodeExer\node_exer1\learn-sequelize\node_modules\sequelize\lib\sequelize.js:314:28
at processTicksAndRejections (internal/process/task_queues.js:95:5)
at async MySQLQueryInterface.insert (D:\nodeExer\node_exer1\learn-sequelize\node_modules\sequelize\lib\dialects\abstract\query-interface.js:308:21)
at async User.save (D:\nodeExer\node_exer1\learn-sequelize\node_modules\sequelize\lib\model.js:2432:35)
at async Function.create (D:\nodeExer\node_exer1\learn-sequelize\node_modules\sequelize\lib\model.js:1344:12)
at async D:\nodeExer\node_exer1\learn-sequelize\routes\users.js:22:26 {
name: 'SequelizeUniqueConstraintError',
errors: [
ValidationErrorItem {
message: 'name_UNIQUE must be unique',
type: 'unique violation',
path: 'name_UNIQUE',
value: 'aa',
origin: 'DB',
instance: [User],
validatorKey: 'not_unique',
validatorName: null,
validatorArgs: []
}
],
parent: Error: Duplicate entry 'aa' for key 'users.name_UNIQUE'
at Packet.asError (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\packets\packet.js:728:17)
at Execute.execute (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\commands\command.js:29:26)
at Connection.handlePacket (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:456:32)
at PacketParser.onPacket (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:85:12)
at PacketParser.executeStart (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\packet_parser.js:75:16)
at Socket.<anonymous> (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:92:25)
at Socket.emit (events.js:400:28)
at addChunk (internal/streams/readable.js:293:12)
at readableAddChunk (internal/streams/readable.js:267:9)
at Socket.Readable.push (internal/streams/readable.js:206:10) {
code: 'ER_DUP_ENTRY',
errno: 1062,
sqlState: '23000',
sqlMessage: "Duplicate entry 'aa' for key 'users.name_UNIQUE'",
sql: 'INSERT INTO users (`id`,`name`,`age`,`married`,`created_at`) VALUES (DEFAULT,?,?,?,?);',
parameters: [ 'aa', '11', false, '2022-12-14 17:38:07' ]
},
original: Error: Duplicate entry 'aa' for key 'users.name_UNIQUE'
at Packet.asError (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\packets\packet.js:728:17)
at Execute.execute (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\commands\command.js:29:26)
at Connection.handlePacket (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:456:32)
at PacketParser.onPacket (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:85:12)
at PacketParser.executeStart (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\packet_parser.js:75:16)
at Socket.<anonymous> (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:92:25)
at Socket.emit (events.js:400:28)
at addChunk (internal/streams/readable.js:293:12)
at readableAddChunk (internal/streams/readable.js:267:9)
at Socket.Readable.push (internal/streams/readable.js:206:10) {
code: 'ER_DUP_ENTRY',
errno: 1062,
sqlState: '23000',
sqlMessage: "Duplicate entry 'aa' for key 'users.name_UNIQUE'",
sql: 'INSERT INTO users (`id`,`name`,`age`,`married`,`created_at`) VALUES (DEFAULT,?,?,?,?);',
parameters: [ 'aa', '11', false, '2022-12-14 17:38:07' ]
},
fields: { name_UNIQUE: 'aa' },
sql: 'INSERT INTO users (`id`,`name`,`age`,`married`,`created_at`) VALUES (DEFAULT,?,?,?,?);'
}
POST /users 500 52.768 ms - 785
Câu trả lời 1
0
ajax요청인가요? ajax 요청은 res.render가 작동안합니다.
0
안녕하세요. 답변 주셔서 감사합니다.
이름(name) 등록시 axois 를 사용 하고 있습니다.
아래 html 에서
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="/sequelize.js"></script>axios 호출 후
sequelize.js 내부에서
//사용자 등록 시
document.getElementById('user-form').addEventListener('submit', async (e) => {
e.preventDefault();
const name = e.target.username.value;
const age = e.target.age.value;
const married = e.target.married.checked; // input type='checkbox' 일때
if(!name) {
return alert('이름을 입력하세요.');
}
if(!age) {
return alert('나이를 입력하세요.');
}
try {
await axios.post('/users', { name, age, married});
getUser();
} catch(err) {
console.error(err);
}
e.target.username.value = '';
e.target.age.value = '';
e.target.married.checked = false; // input type='checkbox' 일때
});이렇게 호출 합니다.
await axios.post('/users', { name, age, married});는 express router 의
.post(async (req, res, next) => {
try {
const user = await User.create({
name : req.body.name,
age : req.body.age,
married : req.body.married
});
console.log(user);
res.status(201).json(user); // status 201 작성됨(생성됨) 뜻
} catch(err) {
console.error(err);
next(err);
}
});에서 User.create 로 등록합니다.
이름 중복시 오류가 나게 되어있으며 next(err) 까지 발생하는 것은 확인 했습니다.
그러나 app.js 의
app.use((err, req, res, next) => {
res.locals.message = err.message;
res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
err.status = err?.status ?? 500;
res.status(err.status);
res.render('error');
});에서 res.render('error') 부분에서 nunjucks 의 error.html 을 호출하지 못 하고 있습니다.
답변 부탁드립니다....꾸벅..
리눅스 노드 설치시 패키지
0
159
0
socket.js 에서 referer로부터 roomId를 가져올 때
0
905
3
스트리밍 방식으로 대용량 파일 업로드 & 다운로드 관련 질문
0
2281
2
a[title] 질문드립니다
0
375
1
리뉴얼 강의 및 공부 방법
0
581
1
jwt decode
0
1128
1
node.js 교과서 3판 질문드립니다
0
391
1
passport와 jwt
0
432
1
리뉴얼 강의
0
417
2
혹시 Node.js 교과서 3판 이북은 언제 나오나요?
0
353
1
몽고디비 사용자도 MYSQL부분을 들어야 하나요???
0
481
1
sql 쿼리 로그는 어떤 모듈이 작성하나요?
0
505
2
질문있습니다.
0
346
1
multer 한글 파일 업로드시 파일명이 깨져요.
1
3535
1
수업자료는 어디있나요?
0
366
1
질문 있습니디
0
235
1
multer 사용시 file 외 name값은 못받나용?
0
416
1
코드 중복 부분 질문드립니다.
0
298
1
api 만드는 이유 질문드립니다.
0
286
1
Strategy의 done에 대해 질문드립니다.
0
362
1
안녕하세요 fs 권한 관련 질문드립니다
0
447
1
시퀄라이즈 연결질문...
0
493
2
res.setHeader vs res.cookie
0
1785
3
실무에서의 에러처리에 대해 질문드립니다.
0
204
1

