인프런 커뮤니티 질문&답변

놀란 팬더님의 프로필 이미지
놀란 팬더

작성한 질문수

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

시퀄라이즈 실습하기

nunjucks res.render('error'); 작동을 안합니다.

해결된 질문

작성

·

434

·

수정됨

0

안녕하세요. 강사님.

현재 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 

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

ajax요청인가요? ajax 요청은 res.render가 작동안합니다.

놀란 팬더님의 프로필 이미지
놀란 팬더
질문자

안녕하세요. 답변 주셔서 감사합니다.

이름(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 을 호출하지 못 하고 있습니다.

답변 부탁드립니다....꾸벅..

 

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

제가 답변드렸을텐데요. ajax 요청은 res.render가 작동하지 않습니다. 정확히는 res.render는 작동하지만 브라우저가 이동하지 않습니다.

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

브라우저에서 location.href로 직접 이동시키세요.

놀란 팬더님의 프로필 이미지
놀란 팬더
질문자

답변감사합니다...꾸벅...

놀란 팬더님의 프로필 이미지
놀란 팬더

작성한 질문수

질문하기