프로그래밍/JS, Node.js

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

Lou Park 2017. 1. 24. 12:06

글 목차

(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편 을 참고하세요!


DB Table: myGames

DB 상태는 저번 시간 그대로다. 이번 예제에서는 이 테이블에서 5번 title인 메이플스토리를 지워보는 시간을 갖도록 하겠다.



./routes/index.js

라인은 많지만 DELETE 메소드를 구현한 부분은 131줄 부터다.

그쪽만 보면된다! 특별히 어렵고 달라진 것이 없기때문에 바로 실행 해 보도록 하겠다.


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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
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);
        });
    });
 
    // >> DELETE
    app.delete("/games/:id"function(req, res) {
        var result = {};
        var id = null;
 
        async.waterfall([
        function(callback) {
            id = mysql.escape(parseInt(req.params.id));
            callback();
        },
        function(callback) {
            if (id == undefined) {
                callback(new Error("Id is empty."));
            } else {
                // db에 연결하여 sql 수행
                pool.getConnection(function(err, conn) {
                    var sql = "DELETE FROM myGames WHERE id=" + id + ";";
                    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



실행 결과

5번 타이틀인 메이플 스토리를 지우기 위해 Postman으로 "http://localhost:3000/games/5"를 DELETE로 날려보았더니

성공했다는 200 코드가 뜬다!



데이터 베이스에서도 5번 메이플 스토리가 사라진 것을 알 수 있다.



이제 API 서버를 만들었으니 다음 강의에서는 이를 활용하는 간단한 웹을 만들어 보도록 하겠다.