반응형
Mini Node Server
엄청나게 어려웠다. 뭐가뭔지 아직도 모르지만 그나마 알아낸걸 적는다.
전체코드
const http = require('http');
const PORT = 5000;
const ip = 'localhost';
const server = http.createServer((request, response) => {
console.log(
`http request method is ${request.method}, url is ${request.url}`
);
if(request.method==='OPTIONS'){
response.writeHead(200, defaultCorsHeader);
// response.end();
response.end('hello mini-server sprints');
}
if(request.method === 'POST' && request.url === '/upper'){
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
body = body.toUpperCase();
response.writeHead(200, defaultCorsHeader);
response.end(body);
});
} else if(request.method === 'POST' && request.url === '/lower'){
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString().toLowerCase();
body = body.toLowerCase();
response.writeHead(200, defaultCorsHeader);
response.end(body);
});
}
else {
response.statusCode = 404;
response.end();
}
});
server.listen(PORT, ip, () => {
console.log(`http server listen on ${ip}:${PORT}`);
});
const defaultCorsHeader = {
'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//preflighted request는 10초까지 허용된다.
};
상세 설명
서버 생성
createServer
를 이용하여 웹 서버 객체를 만든다.
const http = require('http');
const server = http.createServer((request, response) => {});
request의 메서드, url, 헤더
request는 객체인데, request에는 method와 url, header가 있다.
- method는 항상 일반적인 HTTP 메서드/동사이다.
- url은 전체 url서버에서 서버, 프로토콜, 포트를 제외한 것이다.
- header는 소문자로만 표현된다. 일부 헤더를 반복해서 설정한다면 이 값은 헤더에 따라 덮어 씌워지거나 콤마로 구분된 문자열로 합쳐진다.
request
request.on('data',(chunk)=>{})
: 콜백 실행. data 처리하는 부분request.on('end',콜백)
: data 처리가 끝났음을 알려준다.
if(request.method === 'POST' && request.url === '/upper'){
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
body = body.toUpperCase();
response.writeHead(200, defaultCorsHeader);
response.end(body);
});
respond HTTP 상태코드, 명시적인 헤더 데이터 전송
- 상태코드 :
response.statusCode = 404; //클라이언트에게 리소스를 찾을 수 없다고 알려준다.
- 명시적인 헤더 데이터 전송
명시적으로 헤더를 설정하지 않는다면 헤더와 상태코드를 설정하는 메서드는 '암묵적인 헤더'를 사용한다고 가정한다.
원한다면 명시적으로 응답 스트림에 헤더를 작성할 수 있다.
헤더를 작성하는 메소드는 writeHead
메소드 이다.
response.writeHead(200, {
'Content-Type': 'application/json',
'X-Powered-By': 'bacon'
});
if(request.method === 'POST' && request.url === '/upper'){
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
body = body.toUpperCase();
response.writeHead(200, defaultCorsHeader);
response.end(body);
});
- response.end() 메서드
응답 종료,요청완료와 동시에 인수의 값을 클라이언트로 전송한다.
Preflighted request
CORS정책에 의해 유저들이 보호를 받는데, CORS정책중 하나가 Preflighted request이다.
본 요청을 보내기 전에 예비요청을 보내 서버로 부터 허락을 받는 과정중에서 예비 요청을 Preflighted request라고 한다.
HTTP메소드 중 OPTIONS 메소드가 사용된다. 예비 요청의 역할은 본 요청을 보내기 전 브라우저 스스로 이 요청을 보내는 것이 안전한지 확인하는 것이다.
if(request.method==='OPTIONS'){
response.writeHead(200, defaultCorsHeader);
// response.end();
response.end('hello mini-server sprints');
}
예비 요청이 왔을때 OK사인을 보내는 것이다. ( 상태코드 200은 OK)
반응형
'TIL > 코드스테이츠 TIL' 카테고리의 다른 글
코드스테이츠 소프트웨어엔지지어링 부트캠프 +54, 개념정리 (0) | 2021.09.11 |
---|---|
코드스테이츠 소프트웨어엔지지어링 부트캠프 +53, express (0) | 2021.09.10 |
코드스테이츠 소프트웨어엔지지어링 부트캠프 +51, 날씨알리미앱 (0) | 2021.09.08 |
코드스테이츠 소프트웨어엔지지어링 부트캠프 +50 (0) | 2021.09.07 |
코드스테이츠 소프트웨어엔지지어링 부트캠프 +49, 시간복잡도 (0) | 2021.09.06 |