Hello, Android!

RESTful서버 본문

Node

RESTful서버

lwndnjs93 2021. 2. 4. 19:21

lwndnjs93.tistory.com/110

 

REST

클라이언트는 서버에게 주소를 통해 요청을 보낸다 특정 페이지에 대한 요청 또는 서버에게 어떤 행동을 요청한다 클라이언트가 필요한 요청의 내용이 주소를 통해 표현되기때문에 서버가 알

lwndnjs93.tistory.com

이번에는 Node에서 REST를 사용한 주소 체계로 RESTful한 서버를 만들어 보았다

간단하게 서버에 파일을 저장, 검색, 삭제 기능을 수행하도록 하였다

 

각 함수별로 서버에서 수행 가능한 기능을 정리하면

GET : / 를 기준으로 첫번째로 있는 파일을 제공, 파일이 존재하지 않으면 404, 읽기 실패는 500

ex) /ryan 의 경우 ryan파일을 제공

 

POST : / 를 기준으로 첫번째로 있는 이름으로 body를 파일 저장, 서버에서 쓰기 실패는 500

ex) /ryan 의 경우 body를 ryan으로 저장

 

DELETE : / 를 기준으로 첫번째로 있는 이름의 파일을 삭제, 파일이 없는 경우 404, 삭제 실패는 500

ex) /ryan 의 경우 ryan파일을 찾아 삭제

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
const http = require("http")
const fs = require("fs").promises
const nfs = require("fs")
 
http.createServer(async (req, res) => {
    try{
        console.log(req.method, req.url)
        if(req.method === "GET"){
            if(req.url === "/friends"){
                const data = await fs.readFile(`./friends.json`)
                res.writeHead(200, {"Content-Type""application/json; charset=utf-8"})
                return res.end(data)
            }else{
                const fn = req.url.split("/")[1]
                if(nfs.existsSync(`./${fn}`)){
                    try{
                        const data = await fs.readFile(`./${fn}`)
                        res.writeHead(200, {"Content-Type""application/json; charset=utf-8"})
                        return res.end(data)
                    }catch(err){
                        console.error(err)
                        res.writeHead(500)
                        return res.end("file read error")
                    }
                }
            }
            res.writeHead(404)
            return res.end("file not found")
 
        } else if(req.method === "POST"){
            const fn = req.url.split("/")[1]
            let body
            req.on("data", (data) => {
                body = data
            })
            return req.on("end", async () => {
                try{
                    await fs.writeFile(`./${fn}`, body)
                    res.end("write success")
                }catch(err){
                    console.error(err)
                    res.writeHead(500)
                    res.end("file write fail")
                }
            })
        } else if(req.method === "DELETE"){
            const fn = req.url.split("/")[1]
            if(nfs.existsSync(`./${fn}`)){
                try{
                    await fs.unlink(`./${fn}`)
                    return res.end("delete success")
                }catch(err){
                    console.error(err)
                    res.writeHead(500)
                    return res.end("file delete fail")
                }
            }
            res.writeHead(404)
            return res.end("file not found")
        }
    }catch(err){
        console.error(err)
        res.writeHead(500)
        res.end(err.message)
    }
})
.listen(8080, () =>{
    console.log("port 8080")
})
 
 
cs

위의 예제에서 우선 제일 먼저 req.method로 HTTP 메서드를 구분하고 있다

 

- GET

GET인 경우에는 req.url을 사용하여 다시 주소를 구분한다

주소가 /friends 인 경우에는 미리 준비된 friends.json 파일을 제공하고

그 이외의 경우에는 / 뒤의 파일명을 찾아 제공한다

예를들어 /ryan.json 이라면 서버에서 ryan.json을 찾아 제공한다

 

- POST

POST에서 요청 데이터를 받을때는 req.on("data")를 사용하여 받고

이후에는 return req.on("end") 에서 파일을 쓰고 응답을 한 뒤 종료한다

req도 내부적으로는 스트림으로 되어 있기때문에

요청과 응답의 데이터가 스트림 형식으로 전달된다

그렇기 때문에 req.on("data") 에서 요청의 body를 다 읽을때 까지 기다린 뒤

end 이벤트가 발생했을때 파일에 쓰기 작업을 진행하게 된다

 

'Node' 카테고리의 다른 글

클러스터  (0) 2021.02.06
쿠키와 세션  (0) 2021.02.05
http서버  (0) 2021.02.03
이벤트 처리  (0) 2021.02.02
버퍼와 스트림  (0) 2021.02.02