상세 컨텐츠

본문 제목

express, fs, body-parser - nodejs

Programming/Concept

by 쌩우 2019. 6. 20. 21:21

본문

nodejs 기반의 서버 구축을 할 때,
express 모듈을 사용하면 간편하고 쉽게 서버를 다룰 수 있다.

특히 express 사용은,
미들웨어와 라우터 처리가 용이하여 장점을 가진다.

middleware

이름 그대로 중간에서 무엇인가를 처리해주는 녀석이다
https://expressjs.com/ko/guide/using-middleware.html

  • req, res object, 그리고 앱의 요청-응답 주기 중 그 다음의 미들웨어 함수에 대한 액세스 권한을 갖는 함수이다.
  • 특정 미들웨어의 다음 미들웨어 함수는 일반적으로 next라는 이름의 변수로 표시된다.

**미들웨어 함수는 다음의 태스크를 수행할 수 있다.

  • 모든 코드의 실행
  • 요청(req) 및 응답(res) 객체에 대한 변경을 실행
  • 요청-응답 주기를 종료
  • 스택 내의 그 다음 미들웨어 함수의 호출(현재의 미들웨어가 요청,응답 주기를 종료하지 않는 경우 next() 호출하여 그 다음 미들웨어 함수에 제어를 전달해야 한다. 그렇지 않으면 해당 요청은 정지된 채로 방치되어 버린다.)

**서버를 가동 및 각 method에 대한 요청,응답 처리

const express = require('express');                
const cors = require('cors');
const app = express();
const bodyParser = require('body-parser');
const PORT = process.env.NODE_ENV === 'production' ? 3001: 3002
const fs = require('fs');

const defaultCorsHeaders = {
    'access-control-allow-origin': '*',
    'access-control-allow-methods': 'GET, POST, PUT, DELETE, OPTIONS',
    'access-control-allow-headers': 'content-type, accept',
    'access-control-max-age': 10 // Seconds.
};
const headers = defaultCorsHeaders;

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())                            
//req.body에 대해서, chunk를 하나하나 쌓아서 data를 만들고 parse 할 필요 없이, 바로 req.body로 사용할 수 있게 해준다.


app.use(cors())                                        
//cors에 대한 모든 옵션을 허용하고 있다

app.options('/classes/messages', function(req, res){
    res.header(headers);
    res.status(200);
});
// 브라우저가 날린 options 요청에 대해서 응답할 수 있는 부분이다. 이 부분을 먼저 처리하여야 이 후 GET, POST, PUT, DELETE 등이 가능하게 된다.

app.use('/', express.static('client'))
app.get('/', function(req, res) {
    res.sendFile('index.html')
})
//static을 사용해서, 어떤 html이나 js 파일 같은 정적인 것을 보여주고자 할 때, 어떤 path를 사용할 지 지정하였다. ('client')
//그 후, get 요청에 대해서 pathname이 없는 경우, 기본적으로 'index.html'이라는 파일을 보내 보여주도록 하였다.

app.post('/classes/messages', function(req, res) {
    let body = req.body;
    fs.readFile('./data.json', 'utf-8', function(err, data) {
        if(err) { throw err }
        let dataObject = JSON.parse(data);
        dataObject.results.push(body)
        fs.writeFile('./data.json', JSON.stringify(dataObject), 'utf-8', function(err) {
            if(err) {throw err}
        })
        res.status(201).json(dataObject)
    })
})

//POST 요청의 '/classes/messages' pathname인 경우, 보내온 req.body를 'data.json'에 대하여 fs 모듈로 읽고 쓸 수 있게 하였다.
//먼저 data.json의 내용을 parse한 뒤, 거기에 보내온 data를 push하고, 다시 data.json에 덮어쓰기하였다.
//응답으로는 덮어쓰기가 완료된 data.json과 같은 내용을 가진 dataObject를 보내주었다.

관련글 더보기

댓글 영역