Node.js　モジュール？なにそれおいしいの？

駆け出しエンジニアのNode Tutorial学習メモです。
解説するより見て学べ！というニュアンスのまとめとなりました。
実際にコードを読み解いていくと感覚的に理解できるはずです。
　　
学習に使ったサイトはこちら！
→[Node.js Tutorial - W3Schools](https://www.w3schools.com/nodejs/)

##目次
[1.ダウンロードからHelloWorldまで](https://qiita.com/Nakazawa-musc/items/de4f1733504ab27cc86e#1%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89helloworld%E3%81%BE%E3%81%A7)
[2.モジュールとは？](https://qiita.com/Nakazawa-musc/items/de4f1733504ab27cc86e#2%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%A8%E3%81%AF)
[3.ファイルシステムモジュール](https://qiita.com/Nakazawa-musc/items/de4f1733504ab27cc86e#%EF%BC%93%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)
[4.URLモジュール](https://qiita.com/Nakazawa-musc/items/de4f1733504ab27cc86e#4url%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)
[5.NPM](https://qiita.com/Nakazawa-musc/items/de4f1733504ab27cc86e#5npm)
[6.イベント](https://qiita.com/Nakazawa-musc/items/de4f1733504ab27cc86e#6%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88)
[7.ファイルをアップロードする](https://qiita.com/Nakazawa-musc/items/de4f1733504ab27cc86e#7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B)
[8.メールを送信する](https://qiita.com/Nakazawa-musc/items/de4f1733504ab27cc86e#8%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B)



##1.ダウンロードからHelloWorldまで

### Node.jsをダウンロード

Node.jsの公式Webサイトには、Node.jsのインストール手順があります。
[https://nodejs.org/ja/]

### 入門
Node.jsをダウンロードしてコンピューターにインストールしたら、Webブラウザーに「HelloWorld」を表示してみましょう。

「hello.js」という名前のNode.jsファイルを作成し、次のコードを追加します。
これで、コンピューターがサーバーとして機能します。

```javascript:hello.js
var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {"Content-Type": "text/plain; charset=utf-8" });
  res.end('Hello World!');
}).listen(8080);
```
ターミナルでサーバーを起動します。
`C:\Users\Your Name>node myfirst.js`

インターネットブラウザを起動し、アドレスを入力します
[http://localhost:8080]

## 2.モジュールとは？

#### Node.jsのモジュールとは何ですか？
モジュールはJavaScriptライブラリと同じであると考えてください。
#### 内蔵モジュール
Node.jsには、追加インストールなしで使用できる一連の組み込みモジュールがあります。

モジュールを含めるには、`require()`の関数を使用します。

```javascript
var http = require('http');
```
これで、アプリケーションはHTTPモジュールにアクセスできるようになり、サーバーを作成できるようになりました。

#### 独自のモジュールを作成する
独自のモジュールを作成して、アプリケーションに簡単に含めることができます。

次の例では、日付と時刻のオブジェクトを返すモジュールを作成します。

```javascript:date.js
myfirstmodule.js
//現在の日付と時刻を返すモジュールを作成します。

exports.myDateTime = function () {
  return Date();
};
```
これで、任意のNode.jsファイルにモジュールを含めて使用できます。



##３．ファイルシステムモジュール
Node.jsファイルシステムモジュールを使用すると、コンピューター上のファイルシステムを操作できます。

ファイルシステムモジュールを含めるには、次の`require()`方法を使用します。

```javascript
var fs = require('fs');
```
fsモジュールでは以下のようなメソッドを使用できます。

**・ファイルを読む**
`fs.readFile()`

**・ファイルを作成する**
`fs.appendFile()`
`fs.open()`
`fs.writeFile()`

**・ファイルを更新する**
`fs.appendFile()`
`fs.writeFile()`

**・ファイルを削除する**
`fs.unlink()`

**・ファイルの名前を変更する**
`fs.rename()`

[各メソッドの解説はこちら](https://www.w3schools.com/nodejs/nodejs_filesystem.asp)

###ファイルのアップロード
Node.jsを使用してファイルをコンピューターにアップロードすることもできます。
後述する[7.ファイルをアップロードする](https://qiita.com/Nakazawa-musc/items/de4f1733504ab27cc86e#7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B)で詳しく見ていきます。


##4.URLモジュール

URLモジュールは、Webアドレスを読み取り可能な部分に分割します。

URLモジュールを含めるには、次の`require()`を使用します。

```javascript:url.js
var url = require('url');
```
####url.parse()
`url.parse()` メソッドを使用してアドレスを解析すると、アドレスの各部分をプロパティとして持つURLオブジェクトが返されます。

```javascript:url.js
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'
```

###ファイルサーバー
クライアントから要求されたファイルを提供しましょう。

2つのhtmlファイルを作成し、`url.js`ファイルと同じフォルダーに保存します。

```html:summer.html
//summer.html
<!DOCTYPE html>
<html>
<body>
<h1>Summer</h1>
<p>I love the sun!</p>
</body>
</html>
```
```html:winter.html
// winter.html
<!DOCTYPE html>
<html>
<body>
<h1>Winter</h1>
<p>I love the snow!</p>
</body>
</html>
```
要求されたファイルを開き、コンテンツをクライアントに返すNode.jsファイルを作成します。何か問題が発生した場合は、404エラーをスローします。


```javascript:search.js
// demo_fileserver.js：
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);
```

サーバーを起動します。
`C:\Users\Your Name>node search.js`

[http：// localhost：8080 / summer.html]()
[http：// localhost：8080 / winter.html]()
こちらのurlにアクセスすることで、指定したファイルをnode.jsが返してくれます。

##5.NPM

####NPMとは
NPMは、Node.jsパッケージ、または必要に応じてモジュールのパッケージマネージャーです。
[www.npmjs.com]()は、ダウンロードして使用できる何千もの無料パッケージをホストしています。

Node.jsをインストールすると、NPMプログラムがコンピューターにインストールされます。

####パッケージとは
Node.jsのパッケージには、モジュールに必要なすべてのファイルが含まれています。
モジュールは、プロジェクトに含めることができるJavaScriptライブラリです。

###パッケージをダウンロードする
パッケージのダウンロードはとても簡単です。
コマンドラインインターフェイスを開き、必要なパッケージをダウンロードするようにNPMに指示します。

今回は、`upper-case`パッケージをダウンロードしてみます。
`C:\Users\Your Name>npm install upper-case`

NPMは、パッケージが配置される「node_modules」という名前のフォルダーを作成します。今後インストールするすべてのパッケージは、このフォルダーに配置されます。
`C:\Users\My Name\node_modules\upper-case`

###パッケージの使用
パッケージがインストールされると、使用できるようになります。

```javascript
var http = require('http');
var uc = require('upper-case');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write(uc.upperCase("Hello World!"));
  res.end();
}).listen(8080);
// HELLO WORLD!
```

##6.イベント
Node.jsは、イベント駆動型アプリケーションに最適です。

コンピューターでのすべてのアクションはイベントです。接続が確立されたときやファイルが開かれたときのように。

Node.jsのオブジェクトは、ファイルを開いたり閉じたりするときにreadStreamオブジェクトがイベントを発生させるように、イベントを発生させることができます。
[Streamとは](https://qiita.com/masakura/items/5683e8e3e655bfda6756)

```javascript
var fs = require('fs');
var rs = fs.createReadStream('./demofile.txt');
rs.on('open', function () {
  console.log('The file is open');
});
```

###イベントモジュール
Node.jsには、「イベント」と呼ばれる組み込みモジュールがあり、独自のイベントを作成、起動、およびリッスンできます。

組み込みのEventsモジュールを含めるには、require() メソッドを使用します。さらに、すべてのイベントプロパティとメソッドは、EventEmitterオブジェクトのインスタンスです。これらのプロパティとメソッドにアクセスできるようにするには、EventEmitterオブジェクトを作成します。

```javascript
var events = require('events');
var eventEmitter = new events.EventEmitter();
```

###EventEmitterオブジェクト
EventEmitterオブジェクトを使用して、イベントハンドラーを独自のイベントに割り当てることができます。
以下の例では、「scream」イベントが発生したときに実行される関数を作成しました。

イベントを発生させるには、`emit()`メソッドを使用します。

```javascript
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('scream', myEventHandler);
//Fire the 'scream' event:
eventEmitter.emit('scream');
```
[Node.jsのEventEmitterについていろいろ](https://qiita.com/Apacher-inf/items/8f4a6054eea93650b113)


##7.ファイルをアップロードする
###ファイルのアップロード
####恐るべきモジュール
**「Formidable」**と呼ばれる、ファイルのアップロードを処理するための非常に優れたモジュールがあります。

**Formidable**モジュールは、NPMを使用してダウンロードおよびインストールできます。
`C:\Users\Your Name>npm install formidable`

Formidableモジュールをダウンロードしたら、モジュールを任意のアプリケーションに含めることができます。
これで、ユーザーがコンピューターにファイルをアップロードできるようにするWebページをNode.jsで作成する準備が整いました。
成功すると、指定したディレクトリにファイルが追加されます。
<font color="Orange">※少し複雑かもしれませんが、実行結果を確認しながら少しづつ確実に読み解いていきましょう。</font>

```javascript
var http = require('http');
// アップロードされたファイルがサーバーに到達したら解析できるように、Formidableモジュールを含めます。
var formidable = require('formidable');
var fs = require('fs');

http.createServer(function(req, res) {
  if (req.url == '/fileupload') {
    var form = new formidable.IncomingForm();
// ファイルがアップロードされて解析されると、コンピューターの一時フォルダーに配置されます。
// このディレクトリへのパスは、parse()メソッドのコールバック関数の3番目の引数として渡される「files」オブジェクトにあります。
    form.parse(req, function(err, fields, files) {
// 選択したフォルダにファイルを移動するには、ファイルシステムモジュールを使用して、ファイルの名前を変更します。
      var oldpath = files.filetoupload.path;
      var newpath = '/Users/user name/開発している場所のpath/' + files.filetoupload.name;
      fs.rename(oldpath, newpath, function(err) {
        if (err) throw err;
        res.write('File uploaded and moved!');
        res.end();
      });
    });
  } else {
// アップロードフィールドを使用して、HTMLフォームを書き込むNode.jsファイルを作成します。これが初期画面になります。
    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);
```

##8.メールを送信する

###Nodemailerモジュール
Nodemailerモジュールを使用すると、コンピューターから電子メールを簡単に送信できます。
`C:\Users\Your Name>npm install nodemailer
`

###メールを送る

選択した電子メールプロバイダーのユーザー名とパスワードを使用して、電子メールを送信します。このチュートリアルでは、Gmailアカウントを使用してメールを送信する方法を説明します。

:::note alert
実際には送信されないでしょう。Googleセキュリティにより、不正アクセスとみなされブロックされます。
:::

```javascript
var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: 'youremail@gmail.com',
    pass: 'yourpassword'
  }
});

var mailOptions = {
  from: 'youremail@gmail.com',
// 複数の受信者に電子メールを送信するには、toプロパティにコンマで区切って追加します。
  to: 'myfriend@yahoo.com, myotherfriend@yahoo.com',
  subject: 'Sending Email using Node.js',
  text: 'That was easy!'
// 電子メールでHTML形式のテキストを送信するには、「text」プロパティの代わりに「html」プロパティを使用します。
  html: '<h1>Welcome</h1><p>That was easy!</p>'
};

transporter.sendMail(mailOptions, function(error, info){
  if (error) {
    console.log(error);
  } else {
    console.log('Email sent: ' + info.response);
  }
});
```
以上です！これで、サーバーがメールを送信できるようになりました。

##:tada::tada::tada: Congratulations :tada::tada::tada:
MySQLと組み合わせて、更にNode.jsを学んで行きましょう。

こちらからどうぞ：
[Node.jsアプリケーションとMySQLを接続しよう！](https://www.w3schools.com/nodejs/nodejs_mysql.asp)