지난번에 만들었던 chatterbox client 어플은 이미 만들어진 AWS 서버에서 챗들을 받아오고 또 거기에 보내 새로운 챗을 보내 만들어 주었다. 이번 스프린트는 localhost와 연결을 해서 Node.js를 사용한, 서버 측면의 어플을 만드는 것이다.
Advanced
이미 코드 작성은 마쳤지만 복습의 시간을 가져 어떤 부분이 헷갈렸고 어려웠는지, 어떤 부분이 한번 더 복습이 필요한지 정리할 것이다.
/*************************************************************
request handler 함수를 여기서 작성합니다.
reuqestHandler 함수는 이미 basic-server.js 파일에서 사용 했지만, 아직 작동하지 않습니다.
requestHandler 함수를 export 하여 basic-server.js 에서 사용 할 수 있게 하세요
**************************************************************/
var fs = require("fs");
let returnValue = {
"results": [],
};
fs.readFile('./fsfile.json', 'utf8', function(err, data){
if (err){
return;
}
else if (data.length > 0 && typeof (JSON.parse(data)) === "object"){
returnValue = JSON.parse(data);
}
})
var id = 0;
const requestHandler = function(request, response) {
const headers = defaultCorsHeaders;
function change (basic, body){
basic.username = body.username;
basic.text = body.text;
basic.roomname = body.roomname;
basic.id = id;
basic.date = new Date();
return basic;
}
let body = [];
let basicFormat = {
"id": undefined,
"username": undefined,
"text": undefined,
"roomname": undefined,
"date": undefined
}
if (request.method === "OPTIONS"){
response.writeHead(200, headers)
response.end();
return;
}
else if (request.method === "GET"){
if (request.url ==="/classes/messages") {
response.writeHead(200, headers)
response.end(JSON.stringify(returnValue));
}
else {
response.writeHead(404, headers)
response.end("No such url")
}
}
else if (request.method === "POST") {
if (request.url === "/classes/messages" ) {
request
.on("data", chunk => {
body.push(chunk);
})
.on("end", () => {
body = Buffer.concat(body).toString()
body = JSON.parse(body);
returnValue.results.push(change(basicFormat, body));
let number = id;
id ++;
fs.writeFile('./fsfile.json', JSON.stringify(returnValue), "utf8", function(err) {
if (err){
console.log("error")
}
response.writeHead(201, headers);
response.end(JSON.stringify({"id": number}));
});
})
}
else {
response.writeHead(404, headers)
response.end("No such url")
}
}
else {
response.writeHead(200, headers)
response.end("Only valid method is POST")
}
console.log(
'Serving request type ' + request.method + ' for url ' + request.url
);
headers['Content-Type'] = 'text/plain';
};
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.
};
module.exports = requestHandler;
const express = require("express");
const app = express();
const bodyParser = require('body-parser');
const cors = require('cors');
const fs = require('fs');
const PORT = process.env.NODE_ENV === 'production'? 3001:3002
const defaultCorsHeaders = {
'origin': '*',
'methods': 'GET, POST, PUT, DELETE, OPTIONS',
'allowedHeaders': 'content-type, accept',
'maxAge': 10, // Seconds.
"optionsSuccessStatus": 200
};
let returnValue = {
"results": [],
};
app.use(express.static('static'));
app.use(cors(defaultCorsHeaders))
app.use(bodyParser.json())
fs.readFile('./fsfile.json', 'utf8', function(err, data){
if (err){
return;
}
else if (data.length > 0 && typeof (JSON.parse(data)) === "object"){
returnValue = JSON.parse(data);
}
})
app.get('/', function(req, res) {
res.sendFile("index.html");
})
app.get('/classes/messages', function (req, res){
res.status(200).send(JSON.stringify(returnValue));
})
app.post('/classes/messages', function (req, res){
req.body.id = returnValue.results.length;
req.body.date = new Date();
returnValue.results.push(req.body);
fs.writeFile('./fsfile.json', JSON.stringify(returnValue), "utf8", function(err) {
if (err){
console.log("error")
}
res.status(201).send(JSON.stringify(returnValue.results.indexOf(req.body)));
});
})
app.listen(PORT, () => {
console.log(`server listen on ${PORT}`)
})
fs.writeFile('./fsfile.json', JSON.stringify(returnValue), "utf8", function(err) {
if (err){
console.log("error")
}
res.status(201).send(JSON.stringify(returnValue.results.indexOf(req.body)));
});
fs.readFile('./fsfile.json', 'utf8', function(err, data){
if (err){
return;
}
else if (data.length > 0 && typeof (JSON.parse(data)) === "object"){
returnValue = JSON.parse(data);
}
})
첫번째 인자는 읽는 파일, 두번째는 인코딩, 세번째는 읽은 후 실행하는 함수이다. 함수를 보면 그냥 읽은 데이터의 상태를 확인 후 따로 저장해 놓는 객체를 파일에 계속 업데이트 해준다. 그러면 서버가 새로고침을 해도 fs 파일로 데이터를 저장해 놓았기 때문에 예전 챗들을 볼 수 있다.
클라이언트가 요청을 보내야만 서버가 응답을 한다! 만약 서버가 응답을 보내길 원하면 socket을 구현해야 하는데...지금은 할 시간이 없다.
헤더는 생각보다 많은 정보를 담고 매우 중요하다!
고생했다~