なぜ
測定器の繋がったコンピュータ(例えばラズパイ)とか、あるいは何かのアルゴリズムで返事を生成するプログラム(例えばAI)とかに、問い合わせを投げると返事をくれるweb APIみたいなのを用意してみたい。
portを変えてnodeを立ち上げまくっておけば、別の応答サーバに聞きに行って総合的に返事を考えてくれるサーバとかも作れよう。
どのように
json返すだけなのでフル機能の express は要らなかったのだが、これでやるのが一番手が抜けた。
npm
でexpress-generator
をglobal installしておいて、express -v pug
して(デフォルトがjadeなので古いライブラリに依存して文句が出る)、npm install
して準備だけなら完了。
複雑なことを考えないのでroutes/index.js
を書き換える。
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
デフォルトでこうなっているので、最初はこれを書き換えて
router.get('/', function(req, res, next) {
res.set({ 'content-type': 'application/json;charset=utf-8' })
res.json(body(req));
});
とかしてしまう。function body(req)
を用意して、返したいオブジェクトをreturnすればよい。
形ができてきたら
router.post('/', function(req, res, next) {
res.set({ 'content-type': 'application/json;charset=utf-8' })
res.json(body(req));
});
とpostの方に移してしまう。GETの間はテストはブラウザででも叩けばよかったがPOSTになったらcurl
で叩く。
curl -X POST http://localhost:3000 -H "Accept: application/json" -H "Content-type: application/json" -d '{ "uid" : "u0001" }'
curlで送ったjsonは
function body(req) {
let params = req.body;
//...
}
で拾う。
モジュール化
色々と機能を差し替えられるようにしてあると便利そうな気がして、 POST処理まわりをこう変更する。
const mod_name = '../modules/hogehoge.js';
const mod = require(mod_name);
router.post('/', function(req, res, next) {
res.set({ 'content-type': 'application/json;charset=utf-8' })
mod.body(req, (ans) => {res.json(ans)});
});
../modules/
というディレクトリができて、そこに関数が逃がされている。呼び出し方は今度はmod.body(req, (ans) => {res.json(ans)});
となっていて、body()の中で非同期処理をやっていてもすっぽ抜けないようにしてある。
モジュールの名前が1段変数を介しているのは、あまり意味はない。
モジュール側はこう
exports.body = function(req, act) {
let json_data = {"Name":"dummy"};
act(json_data);
}
作成できたjsonを引数で受けているであろう無名関数経由でres.json()
に渡している。
おしまい。