
API를 설계하는 연습을 하는 도중 빈 값이거나 없는 값인데 그냥 빈 배열을 반환하면서 오류가 나지 않는 sql문들이 있어서 코드를 작성할 때 여러 문제가 발생했었다. 이를 정리해보려 한다.
개별 책 조회 API를 만들어서 GET을 보내줬는데 없는 아이디임에도 불구하고 Postman에 빈 배열과 함께 200 OK가 떴다.
router.get('/books/:id', (req,res)=>{
let {id} = req.params
id = parseInt(id)
let sql = `SELECT * FROM books WHERE id = ?`
let values = id
conn.query(sql,values,
function(err,results) {
res.json(results)
})
})
>> results = []
이런 results를 가지고 코드를 짤 때 값이 비어있으므로 오류가 발생한다.
또한, conn.query의 콜백함수에 들어있는 err와는 상관이 없다!!
sql문이 오류인 것인가 vs 아닌가를 생각해봐야 하는 것.
따라서 SELECT 쿼리문은 이런 식으로 예외처리를 해주어야한다.
핵심은 if문의 조건이다. results[0]값이 있으면 ~ 없으면 ~
const curBook = results[0];
if(curBook){
res.status(200).json(`관련내용`);
} else {
res.status(400).end();
}
or
if(results.length){
...동일
}
이와 반대로 책을 등록하는 POST API에서 사용하는 INSERT 경우에..
app.post('/books/:id', (req,res)=>{ //채널 생성
const {name, user_id} = req.body
let sql = `INSERT INTO channels (name,user_id) VALUES (?,?)`
let values = [name,user_id]
conn.query(
sql, values,
function(err,results){
//sql의 에러: 없는 userId사용할때
if(err){
console.log(err)
return res.status(400).end()
}
res.status(201).json(results)
}
)
```
user_id가 FK로 설정이 되어있기 때문에 없는 데이터베이스에 없는 user_id를 사용하면 insert에서 SQL문 오류가 난다. 따라서 이런 경우에는 conn.query 의 콜백함수의 err에서 검출이 된다.
cf. 추가로 UPDATE나 DELETE에서도 주의사항이 존재한다.
update하거나 delete를 요청했지만 변경된 데이터가 없을경우
results를 반환하지 않기 때문에 results.affectedRows를 사용할 수 있다.