LoginSignup
0
1

More than 5 years have passed since last update.

POSTでJSONを投げるとなにかJSONで投げ返してくるサーバ

Last updated at Posted at 2018-06-06

なぜ

測定器の繋がったコンピュータ(例えばラズパイ)とか、あるいは何かのアルゴリズムで返事を生成するプログラム(例えばAI)とかに、問い合わせを投げると返事をくれるweb APIみたいなのを用意してみたい。

portを変えてnodeを立ち上げまくっておけば、別の応答サーバに聞きに行って総合的に返事を考えてくれるサーバとかも作れよう。

どのように

json返すだけなのでフル機能の express は要らなかったのだが、これでやるのが一番手が抜けた。

npmexpress-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()に渡している。

おしまい。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1