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] 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 |