• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

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

22.12.15 01:59 작성 22.12.15 02:46 수정 조회수 357

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로 직접 이동시키세요.

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