Node.js express 서버 만들기
express란?
express를 정의하자면 웹 프레임워크이다.
웹을 빠르게 개발할 수 있는 편리한 도구들의 집합체이다.
웹을 모르는 사람들도 관련된 정보를 기반으로 쉽게 개발 할 수 있다.
express-generator
express의 application skeleton이다.
무슨 말이냐? 뼈대라고 한다.
express를 편리한 도구들의 집합이라고한다면
express generator는 말 그대로 express로 생성한 간단한 뼈대 이다.
뼈대를 구축했기 때문에 움직일 수 있지만 뼈대만 있다.
하지만 뼈대를 구축해주었기 때문에 살만 붙이면 되는 장점이 존재
express-generator
nodefolder 폴더 생성
nodefolder 안에 있는 폴더와 파일들을
상위 폴더로 옮겨주고 nodefolder를 삭제
nodefolder에 있는 내용을 옮긴 폴더 위치에서
명령어를 실행해 package.json에 작성된 패키지를 설치
node_modules 폴더 생성되어 있는지 확인
node 경로에서
명령어 실행하여
서버 구동
client안에는 react 프로젝트 생성
server.js
var express = require('express');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var app = express();
app.use('/', indexRouter);
app.use('/users', usersRouter);
const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Listenning on port ${port}`));
라우팅이란?
네트워크 주소에 따라 목적지 경로를 체계적으로 결정하는 경로 선택 과정
rotues/users.js
var express = require('express');
var router = express.Router();
/* GET users listing. */
router.post('/', function(req, res, next) {
res.send({'message':'respond with a resource'});
});
module.exports = router;
bim/www.js
#!/usr/bin/env node
/**
* Module dependencies.
*/
var app = require('../server');
var debug = require('debug')('nodefolder:server');
var http = require('http');
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '5000');
app.set('port', port);
/**
* Create HTTP server.
*/
var server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Normalize a port into a number, string, or false.
*/
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event.
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}
react와 node 서버를 프록시로 연결
proxy란?
영어로는 대리인
중개 서버를 의미한다.
CORS 이슈를 방지할 수 있다.
CORS(Cross-Origin Resource Sharing) 이슈란?
CORS(Cross-Origin Resource Sharing)는 클라이언트와 서버의 포트가
다른 상태에서 클라이언트 측에서 서버 측으로 무언가를 요청 했을 때 브라우저가
보안상의 이유로 요청을 차단하는 문제
프록시를 사용하는 이유
1. 회사의 직원들이나 집 안의 아이들이 특정한 사이트를 들어갈수 없도록 방지
2. 캐쉬를 이용해 더 빠른 인터넷 이용제공
프록시 서버는 서버 측의 정적 이미지 등을 저장시켜놓을 수 있기 때문에
굳이 서버까지 않아도 프록시 서버를 통해 더욱 빠르게 이미지에 접근
3. 더 나은 보안을 제공
IP를 바꿔서 보내줄 수 있기 때문
client /package.json
{
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"proxy": "http://127.0.0.1:5000"
}
node 서버를 api를 post로 json 데이터 호출 하기
node 경로 routes/users.js
var express = require('express');
var router = express.Router();
/* GET users listing. */
router.post('/', function(req, res, next) {
res.send({'message':'respond with a resource'});
});
module.exports = router;
components/R111_ApiPostJson.js
import React,{Component} from 'react';
class R110_ApiPostJson extends Component {
compoenentDidMount = async () => {
const response = await fetch('/users');
const body = await response.json();
console.log("body.message :" + body.message);
}
render() {
return (
<div>
<h1>call</h1>
</div>
);
}
}
export default R110_ApiPostJson;
get은 url에 쿼리(데이터가 남는다) 해당 데이터를 가져온다 보안 취약한다.
post는 남지 않는다 해당 정보를 서버에 보내서 확인한다
concurrently는 여러 개의 명령어를 동시에 실행할 수 있게 해주는 패키지
서버 경로로 이동 후
concurrently 설치
nodemon 설치
node의 package.json
{
"name": "nodefolder",
"version": "0.0.0",
"private": true,
"scripts": {
"client": "cd client && yarn start",
"server": "nodemon server.js",
"dev" : "concurrently --kill-others-on-fail \" yarn server\" \"yarn client\""
},
"dependencies": {
"concurrently": "^6.3.0",
"cookie-parser": "~1.4.4",
"debug": "~2.6.9",
"express": "~4.16.1",
"http-errors": "~1.6.3",
"jade": "~1.11.0",
"morgan": "~1.9.1"
},
"devDependencies": {
"nodemon": "^2.0.14"
}
}
node 경로의 sever.js 파일을 수정
var express = require('express');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var app = express();
app.use('/', indexRouter);
app.use('/users', usersRouter);
const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Listenning on port ${port}`));