프로그래밍/JS, Node.js

(3) Node.js로 RESTful API 만들기 - PUT편

Lou Park 2017. 1. 24. 11:47

글 목차

(1) Node.js로 RESTful API 만들기 - POST편

(2) Node.js로 RESTful API 만들기 - GET편

현재글 >> (3) Node.js로 RESTful API 만들기 - PUT편

(4) Node.js로 RESTful API 만들기 - DELETE편

(5RESTful API 활용하기 - 웹편 (작성중)

(6) RESTful API 활용하기 - 안드로이드 앱편 (작성중)


* 프로젝트 세팅 과정은 (1) Node.js로 RESTful API 만들기 - POST편 을 참고하세요!


이제 PUT이다! myGames 테이블 상태는 대략 이러한데,

2번 title인 gta를 grand theft auto로 바꿔보는 실습을 해 보겠다.



./routes/index.js

이제 코드가 조금 길어졌다. 하지만 PUT 구현 부분은 몇 줄 안되니 그 쪽 라인만 보면 된다.

gta를 grand theft auto로 바꾸고 싶다면, localhost:3000/games/3에서 { title: "grand theft auto"} 로 PUT 요청을 보내면 된다.

외부에서 오는 요청에 대해서 인젝션 어택을 방지하기위해 모두 mysql.escape()를 쓰는 것이 보안 상 좋다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
var async = require("async");
var mysql = require("mysql");
 
module.exports = function(app, pool) {
    // >> Index page
    app.get("/"function(req, res) {
        // GET 메소드 /games로 넘어감
        res.redirect("/games");
    });
 
    // >> POST
    app.post("/games"function(req, res) {
        var result = {};
        var title = null;
        async.waterfall([
        function(callback) {
            title = mysql.escape(req.body.title);
            callback();
        },
        function(callback) {
            if (title == undefined) {
                callback(new Error("Title is empty."));
            } else {
                // db에 연결하여 sql 수행
                pool.getConnection(function(err, conn) {
                    // title 정보를 DB에 넣기 위한 SQL문 준비
                    var sql = "INSERT INTO myGames (title) VALUES (" + title + ");";
                    console.log("SQL: " + sql);
                    conn.query(sql, function(err) {
                        if (err) {
                            // err가 떠도 conn은 release() 꼭 해주어야한다.
                            conn.release();
                            callback(err);
                        } else {
                            conn.release();
                            callback();
                        }
                    });
                });
            }
        }],
        function(err) {
            result = returnResult(err, res)
            result.status = res.statusCode;
            res.send(result);
        });
    });
 
    // >> GET
    app.get("/games"function(req, res) {
        var result = {};
        // db에 연결하여 sql 수행
        pool.getConnection(function(err, conn) {
            var sql = "SELECT * from myGames;";
            conn.query(sql, function(err, rows) {
                var result = returnResult(err, res);
                if (rows) {
                    result.message = rows;
                }
                conn.release();
                result.status = res.statusCode;
                res.send(result);
            });
        });
    });
 
    // >> GET/id
    app.get("/games/:id"function(req, res) {
        var result = {};
        // SQL injection attack 방지위해 mysql.escape();
        var id = mysql.escape(req.params.id);
        
        // db에 연결하여 sql 수행
        pool.getConnection(function(err, conn) {
            var sql = "SELECT * from myGames WHERE id=" + id + ";";
            conn.query(sql, function(err, rows) {
                var result = returnResult(err, res);
                if (rows) {
                    result.message = rows;
                }
                conn.release();
                result.status = res.statusCode;
                res.send(result);
            });
        });
    });
 
    // >> PUT
    app.put("/games/:id"function(req, res) {
        var result = {};
        var id = null;
        var title = null;
        async.waterfall([
        function(callback) {
            id = mysql.escape(parseInt(req.params.id));
            title = mysql.escape(req.body.title);
            callback();
        },
        function(callback) {
            if (id == undefined) {
                callback(new Error("Id is empty."));
            } else if (title == undefined) {
                callback(new Error("Title is empty."));
            } else {
                // db에 연결하여 sql 수행
                pool.getConnection(function(err, conn) {
                    // title 정보를 업데이트 하기 위한 SQL
                    var sql = "UPDATE myGames SET title=" + title + " WHERE id=" + id + ";";
                    console.log("SQL: " + sql);
                    conn.query(sql, function(err) {
                        if (err) {
                            // err가 떠도 conn은 release() 꼭 해주어야한다.
                            conn.release();
                            callback(err);
                        } else {
                            conn.release();
                            callback();
                        }
                    });
                });
            }
        }],
        function(err) {
            result = returnResult(err, res)
            result.status = res.statusCode;
            res.send(result);
        });
    });
}
 
var returnResult = function(err, res) {
    // 결과를 눈으로 보기 쉽게하기 위해 result 객체 생성
    var result = {};
    if (err) {
        res.status(400);
        result.message = err.stack;
    } else {
        res.status(200);
        result.message = "Success";
    }
    return result;
}
cs


실행 결과

Postman을 이용해서 PUT 요청을 보내 보겠다. 실행전 DB 테이블 상태는 글 맨 앞의 사진과 같다.

아래와 같이 세팅 해 준다음 Send 버튼을 누르면,




Status Code 200이 뜨면서 성공적으로 변경이 완료되었음을 알린다.

MYSQL에 들어가 조회해보면 아래와 같이 바뀐 것을 알 수 있다.