nodejs サーバ構築 チートシート


# node サーバとは
nodejsだけで構築できるので、とにかく早い
他のPCからもアクセスできる
※ポート開放をお忘れなく（EC2の場合はセキュリティグループ） σ(ﾟ∀ﾟ )ｵﾚ

# 背景
他ベンダーの開発が遅れて、いつまでたっても接続テストが始まらないー
モック作るの面倒くさいー
、、と思ったら ~~オー人事オー人事~~ nodeサーバ

# node サーバ (http) チートシート

### 構成

├ server.js
├ package.json
└ download.txt # ダウンロード用ファイル。中身はなんでもok

```javascript:server.js
'use strict';
var log4js = require('log4js');
var logger = log4js.getLogger('test');
log4js.configure({ appenders: { default: { type: "console", layout: { type: "basic" } } }, categories: { default: { appenders: ['default'], level: 'debug' }}, replaceConsole: true, level: 'info' })
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
var http = require('http');
var util = require('util');
var host = 'localhost'; 
var port = 8000;

app.use( function(req,res,next) {
	logger.info('%s %s', req.method, req.url);
	logger.info('header='+JSON.stringify(req.headers));
	logger.info('query='+JSON.stringify(req.query));
	logger.info('body='+JSON.stringify(req.body));
	next();
});

var server = http.createServer(app).listen(port, function() {});
console.log('*** server start http://%s:%s ***',host,port);
logger.info('*** server start http://%s:%s ***',host,port);
server.timeout = 30000;
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0; // オレオレ証明書サーバへリクエストする場合

// top page
app.all('/', function(req, res) { // methodを限定しない
	res.header({'Content-type': 'text/html'});
	res.end(util.format('<h1>http://%s:%s for honya</h1>',host,port)); // サーバの用途が分かるようなタイトルを表示する
});

// json を返す場合 REST形式
app.all('/rest/v1/user/:id', function(req,res) { 
	logger.info('id='+req.params.id); // url パラメータの参照

	let json = {
		id: req.params.id,
		name: "honya",
		dob: (new Date('2020-01-01 12:34:56')).getTime(),
	}
	res.status(201).json(json);
});

// html を返す場合 ASP.NET形式
app.all('/asp/honya.asmx', function(req,res) {
	let html = `
<html>
<body>
	<h1>request url: ${req.method} ${req.url}</h1>
	<div>response</div>
</body>
</html>
`;
	res.end(html); 
});

// 存在するファイルをダウンロードする場合 cgi形式
app.all('/cgi-bin/honya.cgi', function(req,res) { 
	res.download(__dirname + '/download.txt','server.log'); 
});

// csvデータをダウンロードする場合 php形式
app.all('/php/honya.php', function(req,res) { 
	let header = {
		'Content-disposition': 'attachment; filename=server.csv',
		'Content-type': 'text/plain; charset=utf-8',
	}
	res.header(header);

	let csv = "id,name\n1,honya\n";
	res.send(csv); 
});
```


```json:package.json
{
  "dependencies": {
    "body-parser": "^1.19.0",
    "express": "^4.17.1",
    "log4js": "^6.3.0"
  }
}
```


### 起動

```bash:
cd ~/ # ルートフォルダへ移動
npm install # 初回のみ
node server.js
# 終了するときは Ctrl + C
```

### 常時起動


```bash:
cd ~/ # ルートフォルダへ移動
npm install # 初回のみ
npm install forever -g # 初回のみ
forever start -l server.log -a server.js
# 終了するときは forever stopall # 全部止まるけど何個も立ち上げる方が悪い(笑)
```

# あとがき

### 形式について

REST、ASP.NET、cgi、php のurlで４パターンのレスポンスを用意しました。
これが１ファイルで実現できるのは nodejs しかないでしょう。

接続テストができず、100近いurlを用意したことがありますが、このときはjsonを用意して、そこから値を返すようにしました。これは nodejs でなくてもできますが。

### 環境依存について

環境ごとに設定ファイルがあると思いますが、nodeサーバならhost以外は同じにできます。
例）
`honyaUrl: http://devhost:8000/v1/customer/get.asmx`（開発環境）
`honyaUrl: http://prodhost/v1/customer/get.asmx`（本番環境）

**凡ミス多いが多い私には、こういう小っさいところが大きいです**

### モックだよ！

用途がモックなので無駄なことは省きました。

・複数台建てる（portを変えれば いくつでもok）
・portを消す（apache または nginx を使用する）
・チェックを入れる（methodチェック、ヘッダーチェック、入力チェックなど）
・モックから別のサービスへアクセスする（[nodejs request のチートシート](https://qiita.com/ctrlzr/items/12c047456f6d469de45f) ）

これらを要求されたら無駄のラッシュで切り抜けてください
![無駄](https://ctrlzr.sakura.ne.jp/img/ameblo/muda3.gif)


### [nodejs SSLサーバ構築 チートシート](https://qiita.com/ctrlzr/items/0c294d9a474fdf80c78d)