반응형
db연결, 서버만들기 초기설정
// app.js
require('dotenv').config(); // db와 연결해서 typeorm사용하기위해 환경변수를 불러온다
const http = require('http');
const express = require('express');
const { DataSource } = require('typeorm');
const myDataSource = new DataSource({ // DataSource객체를 이용해서 typeorm과 db연결준비
type: process.env.TYPEORM_CONNECTION,
host: process.env.TYPEORM_HOST,
port: process.env.TYPEORM_PORT,
username: process.env.TYPEORM_USERNAME,
password: process.env.TYPEORM_PASSWORD,
database: process.env.TYPEORM_DATABASE
});
myDataSource.initialize().then(() => { // db연결. 연결후 확인 위해 console.log
console.log("Data Source has been initialized")
}).catch(() => {
console.log("Database initiate fail")
})
const app = express(); // express를 실행해서 app에 담는다
app.use(express.json()); // 미들웨어 설정
const port = 8000;
const server = http.createServer(app); // app으로 서버를 만든다
server.listen(port, () => {console.log("서버켜짐");}); //서버를 켜고 확인 위해 console.log
1. 책정보 생성
'/books'로 post요청이 오면 body에 담긴 데이터로 책 정보를 생성한다(books테이블에 저장)
// app.js
app.post('/books', async (req, res) => {
const {title, description, coverImage} = req.body;
await myDataSource.query(
`INSERT INTO books(
title, description, cover_image
) VALUES (?, ?, ?);
`, [title, description, coverImage]
);
res.status(201).json({message: "successfully created"});
});
쿼리를 날리는 비동기이다. 그래서 기다렸다가 다되면 응답해줄수있게 async await사용
* 요청을 cover_image로 보내고 받을때 coverImage로 받아서 데이터가 안들어감!..coverImage에 undefined가 할당됐다
2. 책+작가정보 조회
'/books'에 get요청이 오면 책과 작가의 정보를 보내준다.
책-작가는 중간 테이블(books_authors)이 있는 다대다 관계이다.
확인용으로 데이터를 이렇게 넣어놓은 상황
중간테이블을 이용해서 books와 authors를 조인해서 데이터를 가져오면 된다.
mysql> 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;
위 sql문을 이용해서 get요청이 왔을때 테이블의 각 로우를 객체 형태로 보내주면 된다.
app.get('/books', async(req, res) => {
await myDataSource.query(
`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); //rows에는 각 로우들이 객체 형태로 들어있다. err을 프린트해보면 에러가 출력된다. 에러가 없으면 null
}
);
});
3. 책 정보 수정
'/books' 경로로 수정할 책 데이터를 바디에 담아 put 요청을 보내면 책 정보가 수정되도록 하기
'UPDATE 테이블 SET 수정사항 WHERE 조건' 이용
app.put('/books', async (req, res) => {
const {title, description, coverImage, bookId} = req.body;
await myDataSource.query(
`UPDATE books
SET
title = ?,
description = ?,
cover_image = ?
WHERE id = ?`,
[title, description, coverImage, bookId]
);
res.status(201).json({message: "successfully updated"});
});
url주소를 바꾸는 작업을 한 결과.
title은 not null조건이 있기 때문에 값을 넣지 않거나 null을 넣으면 에러가 난다.
그리고 put은 일부가 아닌 전체 수정을 의미하는 http 메소드이기 때문에 모든 컬럼값을 가지고 요청을 보내도록 한다.
반응형
'TIL' 카테고리의 다른 글
node.js | 인스타그램: 게시글 CRUD (1) | 2022.10.04 |
---|---|
node.js | 인스타그램: 서버-db연결, 회원가입 (1) | 2022.10.03 |
node.js | express, TypeORM 적용한 CRUD API만들기 - 1 db(dbmate) (0) | 2022.10.02 |
node.js | TypeORM 적용하기 (0) | 2022.10.01 |
LeetCode | 009. Palindrome Number (0) | 2022.09.28 |