2023. 5. 30. 21:11ㆍ개인노트-개인공부
w3schools.com - Node.js - 튜토리얼
# Node.js 모듈
- JavaScript의 라이브러리와 동일하다고 생각하면 됩니다.
- 응용 프로그램에 포함하려는 기능 집합.
- 모듈을 포함하려면 모듈 이름과 함께 require() 함수를 사용하면됩니다.
const http = require('http');
## 내장 모듈
- Node.js에는 추가 설치 없이 사용할 수 있는 내장 모듈 세트가 있습니다.
- Node.js Built-in Modules https://www.w3schools.com/nodejs/ref_modules.asp
## 나만의 모듈 만들고 가져오기
- 나만의 자체 모듈을 생성하고 애플리케이션에 쉽게 포함할 수 있습니다.
// myfirstmodule.js
// 현재 날짜와 시간을 반환하는 모듈을 만듭니다.
exports.myDateTime = function () {
return Date();
};
// demo_module.js
// demo_module.js 라는 Node파일에서 myfirstmodule.js 모듈을 사용합니다.
var http = require('http');
var dt = require('./myfirstmodule');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write("The date and time are currently: " + dt.myDateTime());
res.end();
}).listen(8080);
# Node.js http 모듈
- Node.js 에는 HTTP라는 내장 모듈이 있어서 Node.js 가 HTTP를 통해 데이터를 전송할 수 있습니다.
const http = require('http');
## http.createServer()
- HTTP모듈의 createServer() 함수를 사용하여 Node.js 가 웹 서버로서의 기능을 수행하게합니다.
var http = require('http');
//create a server object:
http.createServer(function (req, res) {
res.write('Hello World!'); //write a response to the client
res.end(); //end the response
}).listen(8080); //the server object listens on port 8080
- http.createServer() 에 전달된 함수는 누군가 포트 8080으로 컴퓨터에 액세스하려고 시도할 때 실행됩니다.
## res.writeHead()
- HTTP 서버의 응답이 HTML로 표시되어야 하는 경우 올바른 콘텐츠 유형이 있는 HTTP 헤더를 포함해야 합니다.
- 메소드의 첫 번째 인수는 상태코드이고, 두 번째 인수는 응답 헤더 객체입니다.
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('Hello World!');
res.end();
}).listen(8080);
## req.url
- 쿼리 문자열을 읽을 수 있습니다.
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(req.url);
res.end();
}).listen(8080);
### 예시
http://localhost:8080/summer
res.url의 결과 : /summer
http://localhost:8080/winter
res.url의 결과 : /winter
# Node.js url 모듈
- Node 모듈에는 쿼리 문자열을 읽기 쉽게 분할해주는 내장 모듈이 있습니다.
- url.parse(req.url, true).query
var http = require('http');
var url = require('url');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
var q = url.parse(req.url, true).query;
var txt = q.year + " " + q.month;
res.end(txt);
}).listen(8080);
## 예시
주소 : http://localhost:8080/?year=2017&month=7월
결과 : 2017 July
# Node.js 파일 시스템 모듈
- Node.js 의 파일 시스템 모듈을 사용하면 컴퓨터의 파일 시스템을 사용할 수 있습니다.
var fs = require('fs');
## 파일 시스템 모듈의 일반적인 용도
- 파일 읽기
- 파일 만들기
- 파일 업데이트
- 파일 삭제
- 파일 이름 바꾸기
## fs.readFile() 로 파일 읽기
- 컴퓨터에서 파일을 읽는데 사용됩니다.
### 예시
- HTML 파일을 읽고 콘텐츠를 반환하는 Node.js 파일을 만듭니다.
demofile1.html (Node.js와 동일한 폴더에 있다고 가정)
<html>
<body>
<h1>My Header</h1>
<p>My paragraph.</p>
</body>
</html>
demo_readfile.js
var http = require('http');
var fs = require('fs');
http.createServer(function (req, res) {
fs.readFile('demofile1.html', function(err, data) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(data);
return res.end();
});
}).listen(8080);
## fs.readFile() 로 파일 생성
파일 시스템 모듈에는 새 파일을 만드는 방법이 3가지가 있습니다.
- fs.appendFile()
- fs.open()
- fs.writeFile()
### fs.appendFile()
- 지정된 콘텐츠를 파일에 추가합니다. 파일이 없으면 다음과 같이 파일이 생성됩니다.
var fs = require('fs');
fs.appendFile('mynewfile1.txt', 'Hello content!', function (err) {
if (err) throw err;
console.log('Saved!');
});
### fs.open()
- "플래그"를 두 번째 인수로 사용합니다. 플래그가 "쓰기"를 나타내는 "w"이면 지정된 파일이 쓰기용으로 열립니다. 파일이 없으면 빈 파일이 생성됩니다.
var fs = require('fs');
fs.open('mynewfile2.txt', 'w', function (err, file) {
if (err) throw err;
console.log('Saved!');
});
### fs.writeFile()
- 지정된 파일과 콘텐츠가 있는 경우 이를 바꿉니다. 파일이 존재하지 않으면 지정된 내용을 포함하는 새 파일이 생성됩니다.
var fs = require('fs');
fs.writeFile('mynewfile3.txt', 'Hello content!', function (err) {
if (err) throw err;
console.log('Saved!');
});
## fs.readFile() 로 파일 업데이트
파일 시스템 모듈에는 파일을 업데이트하느 방법이 2가지 있습니다.
- fs.appendFile()
- fs.writeFile()
### fs.appendFile()
- 지정된 파일의 끝에 지정된 콘텐츠를 추가합니다.
var fs = require('fs');
fs.appendFile('mynewfile1.txt', ' This is my text.', function (err) {
if (err) throw err;
console.log('Updated!');
});
// mynewfile1.txt 파일의 끝에 This is my text 를 추가합니다.
### fs.writeFile()
- 지정된 파일과 콘텐츠를 바꿉니다.
var fs = require('fs');
fs.writeFile('mynewfile3.txt', 'This is my text', function (err) {
if (err) throw err;
console.log('Replaced!');
});
// mynewfile3.txt 파일의 내용을 바꿉니다.
## fs.readFile() 로 파일 삭제
파일 시스템 모듈로 파일을 삭제할 수 있습니다.
- fs.unlink()
### fs.unlink()
- 지정된 파일을 삭제합니다.
var fs = require('fs');
fs.unlink('mynewfile2.txt', function (err) {
if (err) throw err;
console.log('File deleted!');
});
// mynewfile2.txt 삭제
## fs.readFile() 로 파일 이름 바꾸기
파일 시스템 모듈로 파일 이름을 바꿀 수 있습니다.
- fs.rename()
### fs.rename()
- 지정된 파일의 이름을 바꿉니다.
var fs = require('fs');
fs.rename('mynewfile1.txt', 'myrenamedfile.txt', function (err) {
if (err) throw err;
console.log('File Renamed!');
});
// "mynewfile1.txt"를 "myrenamedfile.txt"로 이름 바꾸기
# Node.js URL 모듈
- url 모듈은 웹 주소를 읽을 수 있는 부분으로 나눕니다.
var url = require('url');
## url.parse()
url.parse()로 구문 분석을 하면 주소의 각 부분이 속성으로 포함된 URL 개체가 반환됩니다.
- .host
- .pathname
- .search
- .query
var url = require('url');
var adr = 'http://localhost:8080/default.htm?year=2017&month=february';
var q = url.parse(adr, true);
console.log(q.host); //returns 'localhost:8080'
console.log(q.pathname); //returns '/default.htm'
console.log(q.search); //returns '?year=2017&month=february'
var qdata = q.query; //returns an object: { year: 2017, month: 'february' }
console.log(qdata.month); //returns 'february'
# 배운 것을 이용하여 간단한 파일 서버 만들기
- 이제 쿼리 문자열을 구문 분석하는 방법을 알았고, 이전 장에서 Node.js를 파일 서버로 작동시키는 방법을 배웠습니다. 두 가지를 결합하여 클라이언트가 요청한 파일을 제공합니다.
- 두 개의 html 파일을 만들고 node.js 파일과 동일한 폴더에 저장합니다.
summer.html
<!DOCTYPE html>
<html>
<body>
<h1>Summer</h1>
<p>I love the sun!</p>
</body>
</html>
winter.html
<!DOCTYPE html>
<html>
<body>
<h1>Winter</h1>
<p>I love the snow!</p>
</body>
</html>
demo_fileserver.js
// 요청된 파일을 열고 콘텐츠를 클라이언트에 반환하는 Node.js 파일을 만듭니다. 문제가 발생하면 404 오류가 발생합니다.
var http = require('http');
var url = require('url');
var fs = require('fs');
http.createServer(function (req, res) {
var q = url.parse(req.url, true);
var filename = "." + q.pathname;
fs.readFile(filename, function(err, data) {
if (err) {
res.writeHead(404, {'Content-Type': 'text/html'});
return res.end("404 Not Found");
}
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(data);
return res.end();
});
}).listen(8080);
# Node.js NPM
- NPM은 Node.js를 설치할 때 컴퓨터에 설치됩니다.
- NPM은 Node.js 패키지 또는 모듈용 패키지 관리자 입니다.
# Node.js 에서의 Events의 개념과 Node.js events 모듈
## Node.js 에서의 Events의 개념
- Node.js는 이벤트 기반 애플리케이션에 적합(perfect)합니다.
- 컴퓨터의 모든 작업은 이벤트입니다. (예 : 연결이 이루어지거나, 파일이 열릴 때)
### 예시
- 파일을 열고 닫을 때 readStream 객체가 이벤트를 발생시킵니다.
var fs = require('fs');
var rs = fs.createReadStream('./demofile.txt');
rs.on('open', function () {
console.log('The file is open');
});
## Node.js events 모듈
- Node.js에는 events 라는 내장 모듈이 있으며 여기에서 자신의 이벤트를 생성, 실행 및 수신할 수 있습니다.
- 모든 이벤트 속성과 메서드는 EventEmitter 개체의 인스턴스입니다. 이러한 속성과 메서드에 액세스하려면 EventEmitter 개체를 만들어야 합니다.
var events = require('events');
var eventEmitter = new events.EventEmitter();
### EventEmitter 개체
- EventEmitter 객체를 사용하여 나만의 이벤트에 이벤트 핸들러를 할당할 수 있습니다.
- 아래 예제에서는 "myevent" 이벤트가 발생할 때 실행될 함수를 만들었습니다.
- 이벤트를 발생시키려면 emit()메소드를 사용합니다.
var events = require('events');
var eventEmitter = new events.EventEmitter();
//Create an event handler:
var myEventHandler = function () {
console.log('I hear a scream!');
}
//Assign the event handler to an event:
eventEmitter.on('myevent', myEventHandler);
//Fire the 'myevent' event:
eventEmitter.emit('myevent');
# Node.js 파일 업로드
- Formidable 이라는 파일 업로드를 위한 아주 좋은 모듈이 있습니다.
- Formidable 모듈은 NPM을 사용하여 다운로드하고 설치할 수 있습니다.
npm install formidable
var formidable = require('formidable');
## 파일 업로드하기
파일 업로드 예제를 크게 3단계로 진행해봅니다.
1. 업로드 양식 만들기
2. 업로드된 파일 구문 분석
3. 파일 저장
### 1단계 : 업로드 양식 만들기
- 파일 업로드 필드가 있는 HTML 양식을 응답하는 Node.js 파일을 만듭니다.
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
res.write('<input type="file" name="filetoupload"><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}).listen(8080);
### 2단계 : 업로드된 파일 구문 분석
- 업로드된 파일이 서버에 도착하면 구문 분석을 할 수 있도록 Formidable 모듈을 사용합니다.
- 파일이 업로드되고 구문 분석되면 컴퓨터의 임시 폴더에 저장됩니다.
var http = require('http');
var formidable = require('formidable');
http.createServer(function (req, res) {
if (req.url == '/fileupload') {
var form = new formidable.IncomingForm();
form.parse(req, function (err, fields, files) {
res.write('File uploaded');
res.end();
});
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
res.write('<input type="file" name="filetoupload"><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}
}).listen(8080);
### 3단계 : 파일 저장
- 파일이 서버에 성공적으로 업로드되면 임시 폴더에 저장됩니다.
- 임시 폴더의 경로는 parse()메소드의 콜백 함수에서 세 번째 인수로 전달되는 "files" 객체에서 찾을 수 있습니다. files.filetoupload.filepath
- 파일을 선택한 폴더로 이동하려면 파일 시스템 모듈을 사용하고 파일 이름을 바꿉니다.
var http = require('http');
var formidable = require('formidable');
var fs = require('fs');
http.createServer(function (req, res) {
if (req.url == '/fileupload') {
var form = new formidable.IncomingForm();
form.parse(req, function (err, fields, files) {
var oldpath = files.filetoupload.filepath;
var newpath = 'C:/Users/Your Name/' + files.filetoupload.originalFilename;
fs.rename(oldpath, newpath, function (err) {
if (err) throw err;
res.write('File uploaded and moved!');
res.end();
});
});
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
res.write('<input type="file" name="filetoupload"><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}
}).listen(8080);
# Node.js Email
## Nodemailer Module 설치
npm install nodemailer
var nodemailer = require('nodemailer');
## Nodemailer Module 로 이메일 보내기
- 이메일을 보내려면 선택한 이메일 제공업체의 사용자 이름과 비밀번호를 사용합니다.
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'youremail@gmail.com',
pass: 'yourpassword'
}
});
var mailOptions = {
from: 'youremail@gmail.com',
to: 'myfriend@yahoo.com',
subject: 'Sending Email using Node.js',
text: 'That was easy!'
};
transporter.sendMail(mailOptions, function(error, info){
if (error) {
console.log(error);
} else {
console.log('Email sent: ' + info.response);
}
});
## 다중 수신
- 쉼표로 구분하여 mailOptions 객체의 "to" 속성에 추가합니다.
var mailOptions = {
from: 'youremail@gmail.com',
to: 'myfriend@yahoo.com, myotherfriend@yahoo.com',
subject: 'Sending Email using Node.js',
text: 'That was easy!'
}
## HTML을 보내기
- HTML 형식의 텍스트를 보내려면 "text" 속성 대신 "html" 속성을 사용합니다.
var mailOptions = {
from: 'youremail@gmail.com',
to: 'myfriend@yahoo.com',
subject: 'Sending Email using Node.js',
html: '<h1>Welcome</h1><p>That was easy!</p>'
}
'개인노트-개인공부' 카테고리의 다른 글
리팩토링(Refactoring) (2) | 2023.11.26 |
---|---|
JWT(JSON Web Token) (2) | 2023.11.19 |
OAuth (1) | 2023.11.12 |
REST API (0) | 2023.11.05 |
함수형 프로그래밍 (1) | 2023.10.30 |