ARCHIVE/DB

[Node.js] express

man_on 2021. 9. 13. 22:04
반응형
Express

Node.js 환경의 서버 프로그램을 만들 때 사용하는 프레임워크

 

더보기

web server : 화면을 이루는데 필요한 코드, 이미지 등을 res에 담아서줌

API server : 요청한 작업을 처리하고 처리한 결과를 response의 body에 json형식으로 담음

(API application programming interface : a piece of software that can be used by another piece of software)

 

routing : 클라이언트의 요청에 대해 서버가 url보고 분기하여 처리

 

npm init : 현재 디렉토리를 패키지로 만듬

 

port number : 서버 안에서 실행되는 여러 프로그램들 중 특정 프로그램을 식별 할 수 있게 해주는 번호

> app.get(주소, 라우터) 주소에 대한 요청 왔을 때 어떤 동작을 할지

//기본 틀
const express = require('express');      //express module 로드

const app = express();                   //ex module로 객체 만듬(보통app)

//app.get(주소,라우터)
app.get('/',(req, res) => {               //클라>서버 request, 서버>클라 response
  res.send('<h1>hello express</h1>');     //callback함수 > route handler
});
// request가 오면 'hello express'를 response의 body에 담아서 보내줌

app.listen(3000)

 

> without express

더보기
// withoutexpress
const http = require('http') // 1

const server = http.createServer((req, res) => { // 2
  console.log('request received')

  res.setHeader('Content-Type', 'application/json') // 3
  res.end(JSON.stringify({ message: "Welcome to >wecode server! Http server without express" })) // 4
});

server.listen(8080, () => {
  console.log('server is running on PORT 8000')
}) // 5

 1. Node.js 내장 http 모듈

 2. http.createServer 는 라는 메소드는 인자로 또 다른 함수를 받는다 (콜백함수). 

 3. 응답의 header 를 application/json 형태로 세팅

 4. res.end 함수를 통해서 요청에 대한 응답을 마무리

    이 함수의 인자로 넘겨주는 값이 클라이언트가 받는 응답

 5. server 는 앞서 생성한 서버

    listen 함수는 인자로 포트 번호와 콜백함수를 받음

    포트번호로 서버를 연다는 의미이며, 서버가 실행될 때의 로직을 콜백함수 안에서 처리할 수 있습니다. 보통 서버가 켜져있다는 로그 메시지를 남깁

 

const express = require('express');

const app = express ();

const users = ['tom', 'manon', 'je']

/*app객체의 get 메소드는 특정패스에 대해서 요청과 응답을 다루는 함수를
하나씩 설정하기 위해서 쓰는 메소드*/

app.get('/', (req, res) => {
  res.send(`<h1>welcome</h1>`)
})

app.get('/users', (req,res) => {
  res.send(`<h1>${users}</h1>`);
})

/* id 위치에 오는 값을 id라는 속성에 담음
users/1 입력시 브라우저에 'tom'출력 */
app.get('/users/:id', (req,res) => {
  const userName = users[req.params.id - 1];
  res.send(`<h1>${userName}</h1>`);
})

// *(별표,asterisk)는 나머지 모든 URL (모든path)
app.get('*', (req,res) => {
  res.send(`<h1>page not available</h1>`);
})

const port = 3000;
app.listen(port, () => {
  console.log(`App running on port ${port}...`)
})



 > 순서대로 path 처리
 (1) /
 (2) /users
 (3) /users/:id
 (4) *    (1)~(3)외의 모든 path

GET

> Route parameter

  : URL의 path 부분 중 변하는 값이 들어가는 부분은 콜론(:)을 앞에 붙여 표현

    ( id >  id위치에오는 가변적인 값들을 id에 담음 )

app.get('/api/memgers/:id',(req,res) => {
 //const id = req.params.id;
 const { id } = req.params;
});

 

> api중 id로 특정 정보 찾기

더보기
const express = require('express');

const app = express ();

const members = require('./members');

//전체 정보 가져오기
app.get ('/api/members', (req, res) => {
  res.send(members);
});

//원하는 id값 정보 가져오기
app.get ('/api/members/:id', (req, res) => {
  const {id} = req.params;
  const member = members.find((m) => m.id === Number(id));
  if (member) {
    res.send(member);
  } else {
    res.status(404).send({ message : 'There is no such member'});
    //개발자도구 > network > headers > 404
  }
})

/* 
> find는 인자로 들어온 콜백함수가 true를 리턴하는 함수중 첫번째
라우터 id값은 string이라서 number에 넣어서 숫자로 변환
if~ 있다면 res에 담아서 보내줌
find는 없으면 undefined > falsy값 

> status 상태코드
*/
const port = 3000;
app.listen(port, () => {
  console.log(`app running on port ${port}...`)
})

 

> api에서 특정 정보 조회

Query

: 서버에 있는 데이터를 조회할 때 기준을 정하기 위해서 사용  

 ex) http://localhost:3000/api/members ?team=engineering    < 팀이 엔지니어링

       ?team=engineering & orderby=admissionDate & ... < 입사날짜 기준으로 정렬

app.get ('/api/members', (req, res) => {
  // const team = req.query.team;
  const {team} = req.query
  if (team) {
    const teamMembers = members.filter((m) => m.team === team);
    res.send(teamMembers);
  } else {
    res.send(members);
  }
});
더보기
//api
module.exports = [
  {
    id: 1,
    name: 'Alex',
    team: 'engineering',
    position: 'Server Developer',
    emailAddress: 'alex@google.com',
    phoneNumber: '010-xxxx-xxxx',
    admissionDate: '2018/12/10',
    birthday: '1994/11/08',
    profileImage: 'profile1.png',
  },
  ...
 ]

 


POST

app.use(express.json());

app.post('/api/members', (req,res) => {
  const newMember = req.body;
  members.push(newMember);
  res.send(newMember);
});

middleware

 :  위에서부터 순서대로 실행되면서 요청과 응답사이에 기능 추가 (next를 호출해야 다음 미들웨어로 넘어감)

    주소를 넣으면 해당 요청에서만 실행 / 넣지않으면 모든 요청에서 실행

app.use(express.json());
app.use(middle) 모든 요청에서 미들웨어 실행
app.use( '/abc', middle) abc로 시작하는 요청에서 미들웨어 실행
app.post('/abc', middle) abc로 시작하는 post요청에서 미들웨어 실행

 

app.use((req, res, next) => {
  console.log('모든 요청에 다 실행');
  next();
})
app.get('/', (req,res,next) => {
  console.log('get요청에서만 실행');
  next();
}, (req,res) => {
  throw new Error('에러는 에러 처리 미들웨어로 감');
});

app.use((err, req,res, next)=> {
  console.error(err);
  res.status(500).send(err.message)
})

PUT

 

app.put('/api/members/:id', (req, res) => {
  const { id } = req.params;
  const newInfo = req.body;
  const member = members.find((m) => m.id === Number(id));
  if (member) {
    Object.keys(newInfo).forEach((prop) => {       //object.keys 객체의 프로퍼티 순회
      member[prop] = newInfo[prop];
    });
    res.send(member);
  } else {
    res.status(404).send({ message: 'There is no member with the id' });
  }
});

객체 프로퍼티 순회

https://manon-kim.tistory.com/75

 


DELETE

app.delete('/api/members/:id', (req, res) => {
  const { id } = req.params;
  const membersCount = members.length;
  
 //삭제할 id와 같지않은 배열만 추려서 새로운 배열로 만들고 새로운 배열 members
  members = members.filter((member) => member.id !== Number(id));
  if (members.length < membersCount) {
    res.send({message: 'deleted'})
  } else {
    res.status(404).send({ message: 'There is no member with the id' });
  }
});
반응형

'ARCHIVE > DB' 카테고리의 다른 글

[DB] MySQL  (0) 2021.09.15
[DB] Database 기초  (0) 2021.09.14
[Node.js] Protocol / Port / URL  (0) 2021.09.13
[Node.js] 비동기  (0) 2021.09.13
[Node.js] Node.js 기본  (0) 2021.09.12