【Node.js初学者のための基本いろいろ】

ここではNode.jsをこれから勉強していこうかな〜、という人向けに、Node.jsが書けるようになるための基礎てきなものを書いていこうかなと思います。

あくまで、CommonJSモジュールの書き方で説明していきます。

####１，様々な関数の書き方
個人的にはfunctionを矢印で代替できるようなイメージを持っている

```jsx
function sampleFunc(num){
	console.log(num);
}

sampleFunc = function(num){
	console.log(num);
}

sampleFunc = (num) => {
	console.log(num);
}
```

###２，関数をプロパティ化する方法。（オブジェクト指向でいうクラス内のプロパティ的な）
・CommonJSモジュールを使う場合は、ファイル単体をモジュールとみなす。
・`module.exports`に紐付けて外部で利用できるようにする。
・`exports` は`module.exports`の省略形。

```index.js
module.exports.sampleFunc = (num) => {
	console.log(num);
}

exports.sampleFunc2 = (num2) => {
	console.log(num2);
}
// 非同期関数を指定する場合
exports.asyncSample = async(num3) => {
	console.log(num3)
}
```

・上記の関数を別ファイルで利用する方法

```app.js
const index = require('./index')

// index.js 内の sampleFunc()を使うパターン
// ①実行させないでプロパティごと代入
const indexSampleFunc = index.sampleFunc

// ②実行結果を代入
const result = index.sampleFunc(1)

// 非同期関数が実行される。
index.asyncSample(3)
```

####３,　コールバック関数の書き方

非同期なコールバックのきほん
・`process.nextTick`や`setTimeout`で非同期化できる。

```jsx
setTimeout((num) => {
 console.log(num) 
}, 0)
// 以下のほうがライフサイクル的に早く実行される。
process.nextTick((num) => {
 console.log(num) 
})
```

よく使う同期的なコールバック（配列の再構成、並べ替え）

```jsx
let nums = [1,2,3,4,5]
let nextNums = nums.map((num) => { // numには配列の要素が一つずつ入る
	return num * 10;
})
// nextNumsは、[10,20,30,40,50]になる
```

####４，非同期なコールバックのモダンな書き方
async await でかんたんに非同期処理を作る。

```index.js
exports.doubleUp = async(num) => {
		return num * 2;
}
```

上記の非同期関数を別ファイルで使ってみる

・`async`で作った（もしくは`new Promise`）の関数は実行するまで`Promise{pending}`で待機状態となる。
・`await`は非同期関数の直前で使う。
・`await`でrejectedとなったPromiseのエラーを受け取り、エラーを投げる。

```app.js
// 実行せずオブジェクトとして使い回す場合。
// Promise{ pending }となり実行されず待機状態になる。
const sample = index.doubleUp

// 別の非同期関数内で、再利用する場合
exports.app = async(num) => {
	try{
		const result = await index.doubleUp(num);
	}catch(err){
		// もしnumがstringだったりした場合、index.doubleUp()がrejectedとなり、
		// そのエラーがここでキャッチされる。
		return err;
	}
}
```

####５，非同期処理をループさせる（for..await 構文）
・asyncイテラブルであればループさせることができる。

```jsx
// asyncジェネレータ関数はasyncイテラブルを生成する
async function* asyncObjects(){
	let i = 0;
	while(i < 3){
		await Promise.resolve({ foo: 1 });
		yield 'xchfgjvbk';
		i++;
	}
}

for await (const element of asyncObjects()){
	console.log(element) // yieldの後ろの値が返される。
}
```

####６，複数の非同期処理を並行実行する。
・`Promise.all([])` を使う。
・すべての非同期関数が成功（fulfilled）であれば配列で結果を返す。
・ひとつでも失敗（rejected）すれば、その時点でrejectedを返す。
・うまく使えば処理速度が改善できる。

```jsx
const result = Promise.all([
	asyncFunc1(),asyncFunc2(),asyncFunc3(),asyncFunc4()
])
// result -> [〜、〜、〜、〜]
```

####７，Expressを利用する際に覚えておきたい基本
・ExpressとはNode.jsのwebフレームワークでかんたんに各リクエストへの処理をかけたり、様々なモジュールをかんたんに組み込めたりするメリットがある。
個人的にはカスタマイズ性が高いところが好きです。
・get,postの受け取り方と返し方。

```jsx
const app = express()

app.get('/index', (req, res) => {
	//reqにリクエストした際のパラメータなどが含まれている。
	// res.end(), res.send(),などでresponceを返す。
	res.end();
})

app.post('/index', (req, res) => {
	//reqにリクエストした際のパラメータなどが含まれている。
	// res.end(), res.send(),などでresponceを返す。
	res.end();
})
```

####８，Expressでミドルウェアを挟む方法
様々なアプリ側の設定はmiddlewareとしてすでに作られているため、カスタマイズが容易である。（CORSなど）
全パスに挟みたい場合は、すべてのhtttpリクエストの前に行わなければいけないため、全`app.get`や`app.post`の前に書く。

・すべてのパスにミドルウェアを設置する場合
・特定のパスにミドルウェアを設置する場合

```jsx
// ミドルウエア関数
function sampleMiddle(req, res, next){
	// ...処理
	next();
}

// 全パス
app.use(sampleMiddle);

// ./indexにのみ
app.use('./index', sampleMiddle)

// CORSを行う際のミドルウェア
const cors = require('cors')
app.use(cors({ origin: true, credentials: false }))

```