Node.js Express でPOST本文のRawBodyを取得する

Node.js + Express で、POSTされてきたフォームの本文をそのまま取得したかったのでメモ。

body-parserのverify:rawBodySaverオプションを使う必要がある。

const express = require('express');
const bodyParser = require('body-parser');
const app = express();

let rawBodySaver = function(req, res, buf, encoding) {
  if (buf && buf.length) {
    req.rawBody = buf.toString(encoding || 'utf8');
  }
};

app.use(bodyParser.json({verify: rawBodySaver}));
app.use(bodyParser.urlencoded({verify: rawBodySaver, extended: true}));
app.use(bodyParser.raw({verify: rawBodySaver, type: '*/*'}));

app.use(function(req, res){
    console.log(req.rawBody); //rawBody
    res.send(req.rawBody); //rawBody
});

const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
    console.log('App Running...');
});

そのまま生のBody本文使う需要なんかないんだろうな。

JSON変換のサンプルはゴロゴロ見つかったが。

GAE Standard環境のNode.jsでリバースプロキシ構築

SSLのリバースプロキシが欲しかったのでメモ

HTTPS -> GAE (myproject.appspot.com) -> HTTP -> GCE (198.51.100.1:8080)

という構成。

npm初期化してhttpとhttp-proxyをインストール

$ npm init
$ npm install http --save
$ npm install http-proxy --save

で、下記のファイルを用意

app.yaml

runtime: nodejs8

index.js

const http = require('http');
const httpProxy = require('http-proxy');
const port = process.env.PORT || 8080;
httpProxy.createProxyServer({target: 'http://198.51.100.1:8080/'}).listen(port);

package.json
package.jsonはnpm initで作るとして、起動時にindex.jsを実行したいので下記のようにscriptsフィールド内でindex.jsを指定する。

  "scripts": {
    "start": "node index.js"
  },

あとはこれをAppEngineにデプロイ。

$ gcloud app deploy

そしてSSLで https://myproject.appspot.com/ にアクセスするとリクエストが http://198.51.100.1:8080/ にフォワードされる。