http는 내장모듈
express는 외부 모듈
둘 다 웹 서버 모듈이지만 express가 좀 더 간결
let http = require('http'); // 내장 모듈(npm 불필요)
function onRequest(request, response){
response.writeHead(200, {'Content-type' : 'text.html'});
response.write('Hello Node.js');
response.end();
}
http.createServer(onRequest).listen(8888);
// http 모듈의 createServer 함수에 할일을 다 한 다음에
// onRequest 콜백 함수를 실행시킴
npm install express
const express = require('express')
const app = express()
app.get('/', function (req, res) {
res.send('Hello World')
})
app.listen(3000)
const express = require('express')
const app = express()
app.get('/', function (req, res) {
res.send('hello world')
})
// API: GET + "http://localhost:3000/test"
// "test success"
app.get('/test', function (req, res){
res.send("test success")
})
// API: GET + "http://localhost:3000/test/1"
// "one!"
app.get('/test/1', function (req, res){
res.send("one!")
})
app.listen(3000)
app.get('/products/1', function(req,res){
res.send('Node.js를 배워보자(책)');
res.send(2000);
})
이렇게 보내게 되면, 첫 번째 코드인 Node.js를 배워보자(책)만 화면에 출력됨.
뒷 줄부터는 출력이 안된다!
따라서, 데이터를 텍스트가 아니라 객체 형태로 보내야 한다
우리 세상은 다 객체로 이루어져있다
교과서적으로는 0개 이상의 프로퍼티 혹은 메서드로 구성된 집합이라고 볼 수 있다.
좀 다르게 해석하면 주어 자리에 있을 때 문장이 만들어지면 그건 다 객체다.
JavaScript Object Notation
즉, 자바스크립트 객체 표기법이다.
임의의 객체 생성해보자
const book = {
title : 'Node.js를 공부해보자',
price : 20000,
description: '이 책 좋음'
}
send 메서드는 객체든, html이든 모든 종류 다 보내주는 메서드이고
/**
* Send a response.
*
* Examples:
*
* res.send(new Buffer('wahoo'));
* res.send({ some: 'json' });
* res.send('<p>some html</p>');
* res.status(404).send('Sorry, cant find that');
*/
좀 구체적이고 명확하게 객체를 보내고 싶으면, json 메서드 사용하기, 객체 형태로 넣기
const express = require('express')
const app = express()
app.listen(3000)
app.get('/products/1', function(req,res){
res.json({
title : 'Node.js를 공부해보자',
price : 20000,
description: '이 책 좋음 왜? 김송아가 지음'
})
객체를 따로 빼서 작업하는 게 좀 더 객체 지향적인 모습
const express = require('express')
const app = express()
app.listen(3000)
let nodejsbook = {
title : 'Node.js를 공부해보자',
price : 20000,
description: '이 책 좋음 왜? 김송아가 지음'
}
app.get('/products/1', function(req,res){
res.json(nodejsbook);
})
다음의 상황 가정해보자.
product/1 url에서는 1을 프린팅,
product/2 url에서는 2를 프린팅,
product/3 url에서는 3을 프린팅
3개 정도야 하드코딩이 가능하더라도
app.get('/products/1', function(req,res){
res.send({
num : 1
})
})
app.get('/products/2', function(req,res){
res.send({
num : 2
})
})
app.get('/products/3', function(req,res){
res.send({
num : 3
})
})
1000개씩 작업하려면, 불가능함
효율적으로 작업하기 위해서 params이 존재
const express = require('express')
const app = express()
app.listen(3000)
app.get('/products/:n', function(req,res){
// : -> 어? 나한테 url로 매개변수 전달해주나보다?
// products/_ 빈칸에 오는 값을 n이라는 변수에 담아줘!
// req.params
res.json({
num: req.params.n
})
})
app.get() 이 블록 자체가 라우트를 정의하는데 사용되는 매서드.
이 메서드는 HTTP GET 요청을 처리하는 새로운 라우트를 어플리케이션에 추가함.
첫 매개변수는 경로(path, 클라이언트가 서버에 보내는 요청의 URL 일부)이고, 두 번쨰 매개변수는 해당 경로에 대한 요청을 처리하는 콜백 함수이다.
콜백 함수에는 (req, res)라는 두 매개변수 존재
req
req는 HTTP 요청에 대한 전체 정보 포함하고 있음
req.url: 요청된 URL전체 경로와 쿼리 문자열을 나타내는 문자열
req.params: 라우트의 경로 매개변수에 대한 정보를 담고 있는 객체
req.query: 쿼리 매개변수에 대한 정보 담고 있는 객체
req.method: HTTP 메서드를 나타내는 문자열
등등 이외 여러 정보 포함...
/localhost/:n라는 경로가 있으면(:n은 URL에서 동적으로 변경되는 부분)
req.params는 객체고, req.params.n은 해당 매개변수 값에 접근하는 방식
req.params.n은 :n에 해당되는 값
예를 들어, /products/123과 같은 URL에서 123은 :n에 해당함.
res
req에서 얻은 이 값을 응답으로 클라이언트에게 JSON 형식으로 전송한다.
요청이 /products/123이라면, 응답으로는 { num: '123' }이 반환된다.
참고로, res도 객체라서, 여러 메서드가 존재함.
res.send: 문자열, 객체, 배열 등
res.json: JSON 응답
res.render: 뷰 탬플릿을 렌더링해서 HTML 페이지 생성
등등