$ dbmate new create_테이블이름
$ dbmate up
create / read / update / delete
app.post(//(1) '/books', async (req, res) => {
//(2) const { title, description, coverImage} = req.body
await myDataSource.query(
//(3) `INSERT INTO books(
title,
description,
cover_image
) VALUES (?, ?, ?);
`,
[ title, description, coverImage ]
);
res.status(201).json({ message : "successfully created" });
})
의도한 자원이 '책', path 매개변수 자리이기 때문에
req, res 객체를 통해 post 메소드 전송시 함께 들어온 body에 담긴 내용 구조 분해 할당
mysql의 snake_case와 JavaScript의 camelCase 주의!
app.get(//(1) '/books', async(req, res) => {
await myDataSource.query(
//(2) `SELECT
books.id,
books.title,
books.description,
books.cover_image,
authors.first_name,
authors.last_name,
authors.age
FROM books_authors ba
INNER JOIN authors ON ba.author_id = authors.id
INNER JOIN books ON ba.book_id = books.id`
,(err, rows) => {
res.status(200).json(rows);
});
});
의도한 자원이 '책', path 매개변수 자리이기 때문에
중간 테이블을 갖고 있기 때문에 테이블의 관계를 생각하여 query문 작성해야함
app.put(//(1) '/books', async(req, res) => {
//(2) const { title, description, coverImage, bookId } = req.body
await myDataSource.query(
//(3) `UPDATE books
SET
title = ?,
description = ?,
cover_image = ?,
WHERE id = ?
`,
[ title, description, coverImage, bookId ]
);
res.status(201).json({ message : "successfully updated" });
});
의도한 자원이 '책', path 매개변수 자리이기 때문에
req, res 객체를 통해 put 메소드 전송시 함께 들어온 body에 담긴 내용 구조 분해 할당
mysql의 snake_case와 JavaScript의 camelCase 주의!
DB에 입력 및 수정하기 원하는 내용을 테이블에 반영할 수 있도록 쿼리문 작성
app.delete(//(1) '/books/:bookId', async(req, res) => {
//(2) const { bookId } = req.params;
await myDataSource.query(
//(3) `DELETE FROM books
WHERE books.id = ${bookId}
`);
res.status(204).json({ message : "successfully deleted" });
});
타겟 엔드포인트 설정(bookId) : 클라이언트 선에서 뒷 부분에 책의 id 값을 의도대로 기입할 수 있도록 설정
req 객체에 담겨 전송된 path parameter 정수값을 읽어올 수 있도록
req.params 내부의 정수값을 bookId 변수에 할당
DB에 입력 및 삭제하기 원하는 내용을 테이블에 반영할 수 있도록 쿼리문 작성