Things take time

[NodeJS] 4일차 - 서버 만들기 본문

카테고리 없음

[NodeJS] 4일차 - 서버 만들기

겸손할 겸 2017. 12. 13. 20:00

[서버 구축하기]


- Node.js를 이용하여 서버를 구축할 때는 http라는 모듈을 이용하여 listen으로 등록함

var http = require('http');


/*
// 서버 객체 만들기
var server = http.createServer();

// 웹서버를 시작하여 지정 포트에서 대기하도록 설정
var port = 3000;
server.listen(port, function(){
    console.log('웹 서버가 시작되었습니다. %d', port);
});
*/


// 특정 ip에만 지정하여 서버만들때
var host = '127.0.0.1'
var server = http.createServer();
var port = 3000;

// 50000 : timeout 
server.listen(port, host, '50000', function(){
    console.log('웹 서버가 시작되었습니다. %s, %d', host, port);
})

server.on('connection', function(socket){
    var addr = socket.address();
    console.log('클라이언트가 접속했습니다 : %s, %d', addr.address, addr.port);
})

server.on('request', function(req, res){
    console.log('클라이언트 요청이 들어왔습니다.');
    // console.dir(req)
})

그리고 url에서 localhost:3000으로 접속 시




[Http 모듈을 이용한 다른 웹사이트 정보 얻기]

var http = require('http');

var options = {
    host : 'www.google.com',
    port : 80,
    path : '/'
};
// http://google.com:80/

var req = http.get(options, function(res){
    var resData = '';
    res.on('data', function(chunk){
        resData += chunk;
    });
    
    res.on('end', function(){
        console.log(resData);
    });
    
    res.on('error', function(err){
        console.log('오류 발생 : ' + err.message);
    });
});



[익스프레스]


http모듈로는 시간, 노력이 너무 많이 들어 express모듈을 이용함

cmd에 npm init 입력 -> 패키지.json 파일을 생성하여 다운받은 모듈의 집합을 기록하도록 함(추후 다른 곳에 이동시킬 때 이 json만 있으면 모듈 하나하나를 가져갈 필요 없음)


entry point = index.html과 같은 초기 페이지 파일, 따로 만들어야함


- 미들웨어 : 기능상의 분리, 클라이언틔 웹 요청을 기능에 맞게 분리

- 라우터 : 미들웨어에서 해당 기능에 맞는 정보를 처리할 곳, 페이지(화면)를 지정해주는 것, /user, /login 등..

var express = require('express'), http = require('http'); var app = express(); app.set('port', process.env.PORT || 3000); http.createServer(app).listen(app.get('port'), function(){ console.log("익스프레스 서버 시작 : " + app.get('port')); }); app.use(function(req, res, next){ console.log("첫 번재 미들웨어"); req.user = "gyeom"; next(); }) app.use('/', function(req, res, next){ console.log("두 번재 미들웨어"); res.writeHead('200', {'Content-Type' : 'text/html; charset=utf8'}); res.end('<h1>Express서버에서' ...);



app.use의 첫 번째 미들웨어는 해당 경로를 들어왔을 때 무조건 호출되는 미들웨어로 여러 개의 미들웨어 사용시 next()를 꼭 해줘야함


그리고 이후 사용시 url에 전달되는 해당 경로 이후에 따라 분기처리됨

예) localhost:3000 => 첫 번째 미들웨어 + 두 번째 미들웨어

localhost:3000/test => 첫 번째 미들웨어만 호출(/test라는 app.use가 등록이 되어 있어야 함)


[Get, Post 파라미터 얻기]


get의 경우 app.use(function(req, res, next) { });에서

req.query.쿼리를 통해 해당 쿼리에 대한 요청 파라미터를 확인할 수 있음


post의 경우 url이 아닌 본문(body)영역에 들어가있기 때문에 아래와 같이 사용함 (body-parser란 모듈 사용)

// Express 기본 모듈 불러오기 var express = require('express') , http = require('http') , path = require('path'); // Express의 미들웨어 불러오기 var bodyParser = require('body-parser') , static = require('serve-static'); // 익스프레스 객체 생성 var app = express(); // 기본 속성 설정 app.set('port', process.env.PORT || 3000); // body-parser를 이용해 application/x-www-form-urlencoded 파싱 app.use(bodyParser.urlencoded({ extended: false })) // body-parser를 이용해 application/json 파싱 app.use(bodyParser.json()) app.use(static(path.join(__dirname, 'public'))); // 미들웨어에서 파라미터 확인 app.use(function(req, res, next) { console.log('첫번째 미들웨어에서 요청을 처리함.'); var paramId = req.body.id || req.query.id; var paramPassword = req.body.password || req.query.password; res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); res.write('<h1>Express 서버에서 응답한 결과입니다</h1>');

res.write('

Param id : ' + paramId + '

'); res.write('

Param password : ' + paramPassword + '

'); res.end(); }); // Express 서버 시작 http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); });

static은 serve-static이란 모듈을 다운받고, 그 안에 있는 미들웨어로써, 해당 패스에 대해 사용자(클라이언트)가 접근할 수 있도록 하는 설정 미들웨어임


Login.html이란 테스팅 파일을 만들어서 post로 submit하는 폼을 만들었다 가정할 때(그냥 특정 목표 지정없이 post로 submit만 되면 서버는 응답할 것임(기본 미들웨어에서)