개인 노트) w3schools.com - Node.js - 1

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