* 애플리케이션 서버(구형)
jsp
- model2
* 내장 웹서버 (최신)
es
- express
1. 서버 시작법
const express = require( 'express' );
//console.log( express );
const app = express();
app.listen( 3000, () => {
console.log( '3000번 포트에서 요청 대기 중 ...' );
});
2. 컨트롤러 -> 라우팅
app.all( '경로', ( req, res ) =>
{ res.send( '' );
});
app.get / post( '경로', ( req, res ) =>
{ res.send( '' );
});
url 주소에서
? : 문자 존재하거나 생략
+ : 1번이상 반복
* : 임의의 문자
3. 미들웨어 (중간 처리)
app.use - next()
express
use를 사용해서 연결처리하기
// express6.js
"use strict";
const express = require( 'express' );
const app = express();
app.listen( 3000, () => {
console.log( '3000번 포트에서 요청 대기 중 ...' );
});
app.use( '/', (req, res) => {
if( req.method.toLocaleLowerCase == 'post' ) {
res.send( 'Root Post' );
} else {
res.send( 'Root Get' );
}
});
연결 완성과 router 파일 분리
// router.js
"use strict";
const express = require( 'express' );
const router = express.Router();
/*
router.get( '/hello', (req, res) => {
res.send( 'Hello Router' );
});
*/
const sayHello = (req, res) => {
res.send( 'Hello Router' );
};
router.get( '/hello', sayHello );
module.exports = router;
router 파일을 가져와서 연결
// express7.js
"use strict";
const express = require( 'express' );
const app = express();
app.use( require( './router' ) );
app.listen( 3000, () => {
console.log( '3000번 포트에서 요청 대기 중 ...' );
});
express 정적파일(이미지, html) 처리
public/html 폴더 생성
그 폴더에 hello.html 파일 생성
<!-- hello.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h1>hello.html</h1>
</body>
</html>
// static.js
"use strict";
const express = require( 'express' );
const app = express();
app.use( '/static', express.static( 'public' ) );
app.listen( 3000, () => {
console.log( '3000번 포트에서 요청 대기 중 ...' );
});
public 대신 static으로 주소 입력해서 접근
static/html/hello.html
경로에 해당 파일만 있으면 다 접근 가능함
데이터를 받아들일때
다른 미들웨어 사용( server.js 때의 사용, template 엔진 )
https://blog.naver.com/ksh44820/221702705655
template
ejs
pug(jade)
ejs 사용하기
mkdir ejs
cd ejs
npm init -y
npm install express
npm install ejs
html의 특정 태그부분을 치환시켜서 보여줌
// ejs1.js
"use strict";
const ejs = require( 'ejs' );
const people = [ 'greddy', 'neail', 'alex' ];
const html = ejs.render( '<%=people.join( ", "); %>', { people: people } );
console.log( html );
views 폴더 생성
cat.ejs
ejs 파일의 태그
<% 실행
<%= 출력
<!-- cat.ejs -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h1>cat.ejs</h1>
<hr /><br />
title : <%=title %><br />
result : <%=cats.length %><br />
<% cats.forEach( (item) => { %>
<li>
<img src="./<%= item.image %>">
<%= item.title %>
</li>
<% }); %>
</body>
</html>
cat.ejs 를 출력하는 서버
app.set으로 읽을 위치와 파일의 종류를 설정
// server.js
"use strict";
const express = require( 'express' );
const app = express();
// ejs
app.set( 'views', __dirname + '/views' );
app.set( 'view engine', 'ejs' );
app.use( express.static( './' ) );
const data = [
{ title: 'cat1', image: 'google1.png' },
{ title: 'cat2', image: 'google2.png' },
{ title: 'cat3', image: 'google3.png' }
];
app.listen( 3000, () => {
console.log( '3000번 포트에서 서버 대기중입니다.' );
});
app.get( '/', (req, res) => {
res.render( 'cat', { title: 'Cats', cats: data } );
});
구구단 만들기
ejs2 폴더 생성
server.js - server 실행
routes
main.js - routing
views - view page
gugudan.ejs
gugudan_ok.ejs
gugudan.html / gugudan_ok.html
<!-- gugudan.html -->
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8" />
</head>
<body>
Hello gugudan.html
</body>
</html>
<!-- gugudan_ok.html -->
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8" />
</head>
<body>
Hello gugudan_ok.html
</body>
</html>
gugudan.ejs / gugudan_ok.ejs
<!-- gugudan.ejs -->
<% include( './header.ejs' ) %>
<body>
Hello <%=title %>
<br /><hr /><br />
<form action='gugudan_ok' method='post' >
dan : <input type="text" name="dan" />
<input type="submit" value="전송" />
</form>
</body>
<% include( './footer.ejs' ) %>
<!-- gugudan_ok.ejs -->
<% include( './header.ejs' ) %>
<body>
Hello <%=title %>
<br /><hr /><br />
</body>
<% include( './footer.ejs' ) %>
include 시킬 header.ejs 와 footer.ejs -> html 태그를 일부 대신함
<!-- header.ejs -->
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" href="./css/style.css" />
</head>
<!-- footer.ejs -->
</html>
css도 따로 넣어줄수 있음
body {
background-color: gray;
color: black;
}
server.js
app.set으로 ejs파일 서버 연결설정
// server.js
"use strict";
const express = require( 'express' );
const app = express();
const route = require( './routes/main' )( app );
app.set( 'views', __dirname + '/views' );
app.set( 'view engine', 'ejs' );
// 정적파일을 가져올때 static 사용해야함
app.use( express.static( 'public' ) );
app.listen( 3000, () => {
console.log( '3000번 포트에서 서버가 대기중입니다.' );
});
main.js
html 연결과 ejs 연결 다름
네비게이터 역할
// main.js
"use strict";
module.exports = (app) => {
app.all( '/gugudan', (req, res) => {
//res.sendFile( '/home/master/ejs2/views/gugudan.html' );
//res.render( 'gugudan', { title: "gugudan" } );
const data = "gugudan";
res.render( 'gugudan', { title: data } );
});
app.all( '/gugudan_ok', (req, res) => {
//res.sendFile( '/home/master/ejs2/views/gugudan_ok.html' );
//res.render( 'gugudan_ok', { title: "gugudan_ok" } );
const data = "gugudan_ok";
res.render( 'gugudan_ok', { title: data } );
});
}
package.json
파일 수정해서 시작파일을 모르고도 명령어 입력만으로 실행할 수 있게 할 수 있다.
npm test
명령어 지정
"start" : "node server.js"
npm start
<-- package.json -->
{
"name": "ejs2",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node server.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"ejs": "^3.1.6",
"express": "^4.17.1"
}
}
하지만 gugudan_ok에서 값을 받아서 출력하는 것은 쉽지 않음
객체형태의 값만 넘길 수 있음
Express 애플리케이션 생성기(ganerator)
express 애플리케이션의 골격을 빠르게 만들 수 있음
루트 계정에서 설치
su - root
npm i -g express-generator
설치확인
ls /usr/local/lib/node_modules/
원래 계정에서
exit
express --view=ejs sample
cd sample/
ls - 확인용
npm install
ls - 확인용
cat package.json - start 명령 등록되어있음
npm start
브라우저로 접속해보면
기본적으로 필요한 구성이 다 갖춰져서
필요한 ejs파일과 js파일만 추가해서 넣어주면 웹페이지를 구성할 수 있다.
views 폴더에
gugudan.ejs
<!-- gugudan.ejs -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h1>gugudan.ejs</h1><br />
<form action="./gugudan_ok" method="post">
단수 : <input type="text" name="dan" />
<input type="submit" value="전송" />
</form>
</body>
</html>
gugudan_ok.ejs
<!-- gugudan_ok.ejs -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h1>gugudan_ok.ejs</h1>
<hr /><br />
<table width="900" border="1">
<tr>
<% results.forEach( item => { %>
<td> <%=item.dan %> X <%=item.i %> = <%=item.result %></td>
<% }); %>
</tr>
</table>
</body>
</html>
routes 폴더에
gugudans.js
// gugudans.js
var express = require('express');
var router = express.Router();
/* GET users listing. */
router.get('/gugudan', function(req, res, next) {
//res.send( '/gugudans/gugudan' );
res.render( 'gugudan' );
});
router.post('/gugudan_ok', function(req, res, next) {
//res.send( '/gugudans/gugudan_ok' );
//res.render( 'gugudan_ok' );
//const result = req.body.dan;
//console.log( result );
// 순수하게 데이터만 -> 배열/객체로 만들어서
/*
const data = [
{ title:'cat1', image:'cat1.png' },
{ title:'cat2', image:'cat2.png' },
{ title:'cat3', image:'cat3.png' }
];
*/
let result = [];
for( let i=1; i<=9; i++ ) {
let obj = {}
obj.dan = req.body.dan;
obj.i = i;
obj.result = parseInt( req.body.dan ) * i;
result.push( obj );
}
console.log( result );
res.render( 'gugudan_ok', { results: result } );
});
module.exports = router;
jsp 프로그램에서는 이렇게 쓰지만 (html을 담은 string 객체를 넘기지만)
let result = '<table width="800" border="1">';
result += '<tr>';
for( let i=1; i<=9; i++ ) {
result += '<td>' + req.body.dan + 'X' + i + ' = ' + ( parseInt( req.body.dan ) * i ) + '</td>';
}
result += '</tr>';
result += '</table>';
순수하게 데이터만( 객체, 배열 ) 로만 전송되므로
node.js - express에서는 다르게 작성
gugudan_ok.ejs도 그에 맞게 html 태그는 미리 넣어두고 데이터만 forEach로 받아서 쓰는 방식으로 구현
app.js 에 추가
// app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var gugudans = require('./routes/gugudans'); // 새로 추가 한 부분
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
//app.use('/users', usersRouter);
app.use('/gugudans', gugudans); // 새로 추가 한 부분
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
'Javascript > node.js' 카테고리의 다른 글
node.js - jade, express-generator (210226) (0) | 2021.02.26 |
---|---|
node.js - http, express (210224) (0) | 2021.02.24 |
node.js - phantomjs, http (210223) (0) | 2021.02.23 |