codestates / codestates/triplus
[Error] Sequelize의 query를 잘 보자
- Dominant language
- JavaScript
- Stars
- 0
- Forks
- 4
- PR merge metrics
- No merged PRs in 30d
Description
## 어떤 에러가 발생했나요?
- 여행자 모드 페이지에서 가이드 카드 목록을 불러오는데 에러가 발생했다.
### 에러가 발생한 폴더
- server/controller/functions/guide_user_participate.js
### 에러 메시지
```
Error
at y.run (/Users/jortier/code_states_project/project/triplus/server/node_modules/sequelize/dist/lib/dialects/mysql/query.js:1:1030)
at /Users/jortier/code_states_project/project/triplus/server/node_modules/sequelize/dist/lib/sequelize.js:1:7125
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async w.select (/Users/jortier/code_states_project/project/triplus/server/node_modules/sequelize/dist/lib/dialects/abstract/query-interface.js:1:9291)
at async Function.findAll (/Users/jortier/code_states_project/project/triplus/server/node_modules/sequelize/dist/lib/model.js:1:25769)
at async findGuideUserApproved (/Users/jortier/code_states_project/project/triplus/server/controller/functions/guide_user_participate.js:85:25)
at async findGuideUserApproved (/Users/jortier/code_states_project/project/triplus/server/controller/management.js:64:23) {
name: 'SequelizeDatabaseError',
parent: Error: Unknown column 'guide_card.guide_date' in 'order clause'
at Packet.asError (/Users/jortier/code_states_project/project/triplus/server/node_modules/mysql2/lib/packets/packet.js:728:17)
at Query.execute (/Users/jortier/code_states_project/project/triplus/server/node_modules/mysql2/lib/commands/command.js:29:26)
at Connection.handlePacket (/Users/jortier/code_states_project/project/triplus/server/node_modules/mysql2/lib/connection.js:456:32)
at PacketParser.onPacket (/Users/jortier/code_states_project/project/triplus/server/node_modules/mysql2/lib/connection.js:85:12)
at PacketParser.executeStart (/Users/jortier/code_states_project/project/triplus/server/node_modules/mysql2/lib/packet_parser.js:75:16)
at Socket. (/Users/jortier/code_states_project/project/triplus/server/node_modules/mysql2/lib/connection.js:92:25)
at Socket.emit (node:events:390:28)
at Socket.emit (node:domain:475:12)
at addChunk (node:internal/streams/readable:315:12)
at readableAddChunk (node:internal/streams/readable:289:9) {
code: 'ER_BAD_FIELD_ERROR',
errno: 1054,
sqlState: '42S22',
sqlMessage: "Unknown column 'guide_card.guide_date' in 'order clause'",
sql: "SELECT `guide_user_participate`.*, `guide_card->guide_images`.`id` AS `guide_card.guide_images.id`, `guide_card->guide_images`.`guide_id` AS `guide_card.guide_images.guideId`, `guide_card->guide_images`.`image` AS `guide_card.guide_images.image`, `guide_card->guide_images`.`createdAt` AS `guide_card.guide_images.createdAt`, `guide_card->guide_images`.`updatedAt` AS `guide_card.guide_images.updatedAt`, `user`.`user_id` AS `user.userId`, `user`.`nick_name` AS `user.nickName`, `user`.`gender` AS `user.gender`, `user`.`image` AS `user.image` FROM (SELECT `guide_user_participate`.`id`, `guide_user_participate`.`guide_id` AS `guideId`, `guide_user_participate`.`user_id` AS `userId`, `guide_user_participate`.`state`, `guide_user_participate`.`createdAt`, `guide_user_participate`.`updatedAt`, `guide_card`.`guide_id` AS `guide_card.guideId`, `guide_card`.`title` AS `guide_card.title`, `guide_card`.`content` AS `guide_card.content`, `guide_card`.`guide_date` AS `guide_card.guideDate`, `guide_card`.`start_time` AS `guide_card.startTime`, `guide_card`.`end_time` AS `guide_card.endTime`, `guide_card`.`num_people` AS `guide_card.numPeople`, `guide_card`.`state` AS `guide_card.state`, `guide_card`.`address` AS `guide_card.address`, `guide_card`.`latitude` AS `guide_card.latitude`, `guide_card`.`longitude` AS `guide_card.longitude`, `guide_card`.`open_date` AS `guide_card.openDate`, `guide_card`.`user_id` AS `guide_card.userId`, `guide_card`.`createdAt` AS `guide_card.createdAt`, `guide_card`.`updatedAt` AS `guide_card.updatedAt` FROM `guide_user_participate` AS `guide_user_participate` INNER JOIN `guide_card` AS `guide_card` ON `guide_user_participate`.`guide_id` = `guide_card`.`guide_id` AND `guide_card`.`state` = 'APPROVED' WHERE `guide_user_participate`.`user_id` = 'a123' LIMIT 0, 6) AS `guide_user_participate` LEFT OUTER JOIN `guide_image` AS `guide_card->guide_images` ON `guide_card.guideId` = `guide_card->guide_images`.`guide_id` LEFT OUTER JOIN `user` AS `user` ON `guide_user_participate`.`userId` = `user`.`user_id` ORDER BY `guide_card`.`guide_date` ASC;",
parameters: undefined
},
original: Error: Unknown column 'guide_card.guide_date' in 'order clause'
at Packet.asError (/Users/jortier/code_states_project/project/triplus/server/node_modules/mysql2/lib/packets/packet.js:728:17)
at Query.execute (/Users/jortier/code_states_project/project/triplus/server/node_modules/mysql2/lib/commands/command.js:29:26)
at Connection.handlePacket (/Users/jortier/code_states_project/project/triplus/server/node_modules/mysql2/lib/connection.js:456:32)
at PacketParser.onPacket (/Users/jortier/code_states_project/project/triplus/server/node_modules/mysql2/lib/connection.js:85:12)
at PacketParser.executeStart (/Users/jortier/code_states_project/project/triplus/server/node_modules/mysql2/lib/packet_parser.js:75:16)
at Socket. (/Users/jortier/code_states_project/project/triplus/server/node_modules/mysql2/lib/connection.js:92:25)
at Socket.emit (node:events:390:28)
at Socket.emit (node:domain:475:12)
at addChunk (node:internal/streams/readable:315:12)
at readableAddChunk (node:internal/streams/readable:289:9) {
code: 'ER_BAD_FIELD_ERROR',
errno: 1054,
sqlState: '42S22',
sqlMessage: "Unknown column 'guide_card.guide_date' in 'order clause'",
sql: "SELECT `guide_user_participate`.*, `guide_card->guide_images`.`id` AS `guide_card.guide_images.id`, `guide_card->guide_images`.`guide_id` AS `guide_card.guide_images.guideId`, `guide_card->guide_images`.`image` AS `guide_card.guide_images.image`, `guide_card->guide_images`.`createdAt` AS `guide_card.guide_images.createdAt`, `guide_card->guide_images`.`updatedAt` AS `guide_card.guide_images.updatedAt`, `user`.`user_id` AS `user.userId`, `user`.`nick_name` AS `user.nickName`, `user`.`gender` AS `user.gender`, `user`.`image` AS `user.image` FROM (SELECT `guide_user_participate`.`id`, `guide_user_participate`.`guide_id` AS `guideId`, `guide_user_participate`.`user_id` AS `userId`, `guide_user_participate`.`state`, `guide_user_participate`.`createdAt`, `guide_user_participate`.`updatedAt`, `guide_card`.`guide_id` AS `guide_card.guideId`, `guide_card`.`title` AS `guide_card.title`, `guide_card`.`content` AS `guide_card.content`, `guide_card`.`guide_date` AS `guide_card.guideDate`, `guide_card`.`start_time` AS `guide_card.startTime`, `guide_card`.`end_time` AS `guide_card.endTime`, `guide_card`.`num_people` AS `guide_card.numPeople`, `guide_card`.`state` AS `guide_card.state`, `guide_card`.`address` AS `guide_card.address`, `guide_card`.`latitude` AS `guide_card.latitude`, `guide_card`.`longitude` AS `guide_card.longitude`, `guide_card`.`open_date` AS `guide_card.openDate`, `guide_card`.`user_id` AS `guide_card.userId`, `guide_card`.`createdAt` AS `guide_card.createdAt`, `guide_card`.`updatedAt` AS `guide_card.updatedAt` FROM `guide_user_participate` AS `guide_user_participate` INNER JOIN `guide_card` AS `guide_card` ON `guide_user_participate`.`guide_id` = `guide_card`.`guide_id` AND `guide_card`.`state` = 'APPROVED' WHERE `guide_user_participate`.`user_id` = 'a123' LIMIT 0, 6) AS `guide_user_participate` LEFT OUTER JOIN `guide_image` AS `guide_card->guide_images` ON `guide_card.guideId` = `guide_card->guide_images`.`guide_id` LEFT OUTER JOIN `user` AS `user` ON `guide_user_participate`.`userId` = `user`.`user_id` ORDER BY `guide_card`.`guide_date` ASC;",
parameters: undefined
},
sql: "SELECT `guide_user_participate`.*, `guide_card->guide_images`.`id` AS `guide_card.guide_images.id`, `guide_card->guide_images`.`guide_id` AS `guide_card.guide_images.guideId`, `guide_card->guide_images`.`image` AS `guide_card.guide_images.image`, `guide_card->guide_images`.`createdAt` AS `guide_card.guide_images.createdAt`, `guide_card->guide_images`.`updatedAt` AS `guide_card.guide_images.updatedAt`, `user`.`user_id` AS `user.userId`, `user`.`nick_name` AS `user.nickName`, `user`.`gender` AS `user.gender`, `user`.`image` AS `user.image` FROM (SELECT `guide_user_participate`.`id`, `guide_user_participate`.`guide_id` AS `guideId`, `guide_user_participate`.`user_id` AS `userId`, `guide_user_participate`.`state`, `guide_user_participate`.`createdAt`, `guide_user_participate`.`updatedAt`, `guide_card`.`guide_id` AS `guide_card.guideId`, `guide_card`.`title` AS `guide_card.title`, `guide_card`.`content` AS `guide_card.content`, `guide_card`.`guide_date` AS `guide_card.guideDate`, `guide_card`.`start_time` AS `guide_card.startTime`, `guide_card`.`end_time` AS `guide_card.endTime`, `guide_card`.`num_people` AS `guide_card.numPeople`, `guide_card`.`state` AS `guide_card.state`, `guide_card`.`address` AS `guide_card.address`, `guide_card`.`latitude` AS `guide_card.latitude`, `guide_card`.`longitude` AS `guide_card.longitude`, `guide_card`.`open_date` AS `guide_card.openDate`, `guide_card`.`user_id` AS `guide_card.userId`, `guide_card`.`createdAt` AS `guide_card.createdAt`, `guide_card`.`updatedAt` AS `guide_card.updatedAt` FROM `guide_user_participate` AS `guide_user_participate` INNER JOIN `guide_card` AS `guide_card` ON `guide_user_participate`.`guide_id` = `guide_card`.`guide_id` AND `guide_card`.`state` = 'APPROVED' WHERE `guide_user_participate`.`user_id` = 'a123' LIMIT 0, 6) AS `guide_user_participate` LEFT OUTER JOIN `guide_image` AS `guide_card->guide_images` ON `guide_card.guideId` = `guide_card->guide_images`.`guide_id` LEFT OUTER JOIN `user` AS `user` ON `guide_user_participate`.`userId` = `user`.`user_id` ORDER BY `guide_card`.`guide_date` ASC;",
parameters: undefined
}
ERROR: TypeError: guideList is not iterable
```
### 에러 원인
database에 query를 보내는데 subQuery로 만들어 보내고 있었다.
### 에러 해결 방법
```javascript
const guideList = await guide_user_participate.findAll({
subQuery: false, // subQuery를 false로 지정하여 subQuery를 발생하지 않게 했다
where: {
userId: accessToken.userId,
},
include: [
{
model: guide_card,
where: {
state: GLOBAL_VARIABLE.APPROVED,
},
include: [
{
model: guide_image,
},
],
},
{
model: user,
attributes: ['nickName', 'gender', 'image'],
},
],
order: [[guide_card, 'guideDate', req.query.sortBy]],
offset: pages * 6 - 6,
limit: 6,
}).catch(error => {
console.log(error);
resObject['code'] = 200;
});
```
에러를 해결하면서 관련 링크는 없었으며, subQuery를 발생하는 것을 보고
전에 사용해봤던 subQuery 옵션을 사용했습니다.
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.