[데브코스] Node.js express

·2024년 4월 26일
0

데브코스

목록 보기
11/20

1. HTTP vs express

http는 내장모듈

express는 외부 모듈

둘 다 웹 서버 모듈이지만 express가 좀 더 간결

  • http 사용하기(내장 모듈이라 npm 불필요)
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으로 express 모듈 설치 후 사용하기
npm install express
const express = require('express')
const app = express()

app.get('/', function (req, res) {
  res.send('Hello World')
})

app.listen(3000)
  1. 내장 메서드인 http랑 형태가 다름, 좀 더 간결
  2. app.listen() 이 부분은 어디에 있든지 상관 없음, 순서 상관 없음
  3. express를 command클릭하면 세부 파일로 이동 가능

  • 추가적인 작업해보기(/test, /test/1 경로 추가해보기)
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)

2. 객체로 작업하자, JSON

app.get('/products/1', function(req,res){
    res.send('Node.js를 배워보자(책)');
    res.send(2000);
})

이렇게 보내게 되면, 첫 번째 코드인 Node.js를 배워보자(책)만 화면에 출력됨.

뒷 줄부터는 출력이 안된다!

따라서, 데이터를 텍스트가 아니라 객체 형태로 보내야 한다

  • 객체란?

우리 세상은 다 객체로 이루어져있다

교과서적으로는 0개 이상의 프로퍼티 혹은 메서드로 구성된 집합이라고 볼 수 있다.

좀 다르게 해석하면 주어 자리에 있을 때 문장이 만들어지면 그건 다 객체다.

2.1 JSON

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);
})

3. params

다음의 상황 가정해보자.

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 요청에 대한 전체 정보 포함하고 있음

  1. req.url: 요청된 URL전체 경로와 쿼리 문자열을 나타내는 문자열

  2. req.params: 라우트의 경로 매개변수에 대한 정보를 담고 있는 객체

  3. req.query: 쿼리 매개변수에 대한 정보 담고 있는 객체

  4. 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도 객체라서, 여러 메서드가 존재함.

  1. res.send: 문자열, 객체, 배열 등

  2. res.json: JSON 응답

  3. res.render: 뷰 탬플릿을 렌더링해서 HTML 페이지 생성

    등등

0개의 댓글