HTML의 생성을 Web Application에게 맡김
V8 엔진 기반 : 컴퓨터 자체를 제어
생산성
사용자의 참여가 가능
구조
WEB Browser
, HTML
, WEB Application
Node.js runtime
, JavaScript, Node.js Application
Node.js runtime
설치
node -v
JavaScript
문법Node.js runtime
기능Node.js Application
만들기var http = require('http');
var fs = require('fs');
var app = http.createServer(function(request,response){
var url = request.url;
if(request.url == '/'){
url = '/index.html';
}
if(request.url == '/favicon.ico'){
response.writeHead(404);
response.end();
return;
}
response.writeHead(200);
response.end(fs.readFileSync(__dirname + url));
});
app.listen(3000);
목표
http://opentutorials.org:3000/main?id=HTML&page=12
http
: protocol
: 통신규칙 : 사용자가 서버에 통신할때 어떤 규칙을 이용할지opentutorials.org
: host(domain)
: 인터넷에 접속되있는 각각의 컴퓨터 : 특정한 인터넷에 연결되어 있는 컴퓨터를 가리키는 주소3000
: port
: 한 대의 컴퓨터 안에 여러 대의 서버 중에 3000번 포트와 연결main
: path
: 컴퓨터 안에 있는 파일의 경로id=HTML&page=12
: query string
: 웹서버에게 데이터를 전달 가능 : ?
로 시작, 값과 값은 &
, 값의 이름과 값은 =
로 구분목표
Query String
에 따라 다른 정보를 보여준다.url
값을 추출해 원하는 값을 얻어낼 수 있다.
localhost:3000/?id=HTML
: id=HTML
의 HTML
값을 알아내고 싶다.nodejs url parse query string
queryData
= { id : HTML }
queryData.id
= HTML
var url = require('url');
var _url = request.url;
var queryData = url.parse(_url, true).query;
response.end(queryData.id);
타이틀을 정적으로 바꾸기
${title}
root
로 접속시 제목 Welcome
var title = queryData.id;
if(_url == '/'){
title = 'Welcome';
var template =`
<title>WEB1 - ${title}</title>
response.end(template)
CRUD
Create
, Read
, Update
, Delete
READ
nodejs file read
// nodejs/readfile.js
var fs = require('fs');
fs.readFile('sample.txt', 'utf8', function(err, data){
console.log(data);
});
목표
Query string
에 따라서 본문
이 변경되는 App본문에 넣을 폴더 생성
fs
를 이용해 폴더안의 파일을 읽는다
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description){
var template =`
<title>WEB1 - ${title}</title>
<p>${description}</p>
response.end(template)
}
INPUT
Parameter
, Argument
nodejs console input parameters
OUTPUT
배열의 3번째(인덱스2) 부터 값이 들어간다
// conditional.js
var args = process.argv;
if(args[2] === '1'){
console.log('C1');
} else {
console.log('C2');
}
console.log('D');
// 출력 : node conditional.js 1 -> C1 D
// 출력 : node conditional.js 2 -> C2 D
목표
url.parse(_url, true)
url
에 대한 정보가 객체로 담겨있다.pathname
: /
path
: /?id=CSS
: Query string
을 포함한 정보var pathname = url.parse(_url, true).pathname;
if(pathname === '/'){
} else {
response.writeHead(404);
response.end('Not found');
목표
queryData.id === undefined
root
경로if(queryData.id === undefined){
// root 경로일 때 정보를 보여준다.
} else {
// url에 맞는 정보를 보여준다.
}
목표
검색 : nodejs file list in directory
배열로 출력
var testFolder = './data';
var fs = require('fs');
fs.readdir(testFolder, function(error, filelist){
console.log(filelist);
})
if(pathname === '/'){
if(queryData.id === undefined){
fs.readdir('./data', function(error, filelist){
var list = '<ul>';
var i = 0;
while(i < filelist.length){
list = list + `<li><a href="/?id=${filelist[i]}">${filelist[i]}</a></li>`;
i = i + 1;
}
list = list+'</ul>';
${list}
})
} else {
}
function templateHTML(title, list, body){
// 중복내용
}
function templateList(filelist){
// 중복내용
}
목표
asynchronous
차이
readFileSync
: 동기 readFile
: 비동기// result == B
var fs = require('fs');
console.log('A');
var result = fs.readFileSync('syntax/sample.txt', 'utf8');
console.log(result);
console.log('C');
// 출력 : A B C
console.log('A');
fs.readFile('syntax/sample.txt', 'utf8', function(err, result){
console.log(result);
});
console.log('C');
// 출력 : A C B
var a = function(){
console.log('A');
}
function slowfunc(callback){
callback();
}
slowfunc(a); // A
NPM
pm2
설치 : npm install pm2 -g
pm2 start app.js
목표
post
get
<form action="http://localhost:3000/process_create" method="post">
<p><input type="text" name="title"></p>
<p>
<textarea name="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
목표
목표
목표
목표
목표
목표
목표
목표
목표
// nodejs/mpart.js
var M = {
v:'v',
f:function(){
console.log(this.v);
}
}
module.exports = M;
// muse.js
var part = require('./mpart.js');
part.f(); // v
목표
목표
검색 : node path parse
목표
목표