chrome blog

Chromebookとか、ライフハックとか

GetだけのRestサーバを作る(nodejs express使用)

まえおき

RestサーバからGetで情報もらってきて、それに応じて動くプログラムを書くことになった。 そのRestサーバは他のところでこれから作る…となると、まずは自前でRestサーバを立てるしかない。

コード書かずに作りたいなーと思ったら、 nodejsで動くJSON Serverがあった。

db.jsonにルールを書いて食わせれば、特にコードなしでRESTサーバが構築できる。 こんなデータを返すんだよね~というイメージ共有には良かった。

しかし、パラメータ(クエリ)に応じてデータ返す…となると、 パッと見やり方(コードの書き方)が分からなかった(´・ω・`)

もともとやりたいのはGetで値を返すだけ。JSON Serverを理解するよりも、 JSON ServerもWebサーバ機能として使ってるExpressだけ使ってコード書いたほうが楽そう。。

他の言語なら、JavaのJersey、pythonのeveあたりが良さそうだったけど、 最近Hubotをいじっていることもあり、nodejs + express 作ってみることにした。

環境構築

Ubuntu 17.10 を使用した。nodeやnpmを最新にするやりかたは、 qiitaの記事 Ubuntuに最新のNode.jsを難なくインストールする - Qiita が良い感じ。

コマンドを羅列しておくと、こんな感じ(クリックで展開)

sudo apt install nodejs npm      # いったん標準のnodejsとnpmを入れる
sudo npm install n -g            # Node version management の nコマンドを入れる
sudo n stable                    # nで安定版の最新に
sudo apt-get purge -y nodejs npm # 標準のnodejsとnpmを消す
node -v                          # 一応コマンドがいるか確認
npm -v

あとはexpressと、expressテンプレ生成のexpress-generatorを入れればOK。

npm install -g express express-generator

テンプレ生成

express <アプリ名> でテンプレが生成される。特にオプションなしで実行すると、 デフォルトのjadeは今後デフォルトじゃなくなるぜ、ってwarningが出るので…

$ express  restTest

  warning: the default view engine will not be jade in future releases
  warning: use `--view=jade' or `--help' for additional options
  ...(以下略)

express --view=pug <アプリ名> のように、今後デフォルトになるpugを指定すると良さそう。

$ express --view=pug restTest

   create : restTest
   create : restTest/package.json
   create : restTest/app.js
   create : restTest/public
   create : restTest/routes
   create : restTest/routes/index.js
   create : restTest/routes/users.js
   create : restTest/views
   create : restTest/views/index.pug
   create : restTest/views/layout.pug
   create : restTest/views/error.pug
   create : restTest/bin
   create : restTest/bin/www
   create : restTest/public/javascripts
   create : restTest/public/images
   create : restTest/public/stylesheets
   create : restTest/public/stylesheets/style.css

   install dependencies:
     $ cd restTest && npm install

   run the app:
     $ DEBUG=resttest:* npm start

そして表示通りに install dependencies してあげる。

$ cd restTest && npm install
npm notice created a lockfile as package-lock.json. You should commit this file.
added 123 packages in 9.726s

一度expressサーバ起動して…

$ DEBUG=resttest:* npm start

ブラウザから、サーバのIP:3000にアクセスして、応答が来ればOK。

restTest APIを作成

app.js には restTest にアクセスが来たら、restTest.js で処理するよ、を追記する(diff↓)

@@ -9,2 +9,3 @@
 var users = require('./routes/users');
+var restTest = require('./routes/restTest');

@@ -26,2 +27,3 @@
 app.use('/users', users);
+app.use('/restTest', restTest);

あとは routes/restTest.js に処理を書いてあげる。 試しに、restTest/pokemon?lang=ja が来たら日本語を、その他なら英語を、lang指定がなければ変なJSONを返す処理を書いてみる。

var express = require('express');
var router = express.Router();

router.get('/pokemon', function (req, res) {
  var lang = req.query.lang;
  var message;

  if (lang == null)
    message = 'langがなっしー'
  else if (lang == 'ja')
    message = 'ゲットだぜ!'
  else
    message = 'Gotcha!'

  var jsonMessage = {'pokemon':message};
  res.json(jsonMessage);
});

module.exports = router;

expressサーバを起動して、こんどはcurlでアクセスしてみる。

$ curl localhost:3000/restTest/pokemon?lang=ja
{"pokemon":"ゲットだぜ!"}
$ curl localhost:3000/restTest/pokemon?lang=tekitou
{"pokemon":"Gotcha!"}
$ curl localhost:3000/restTest/pokemon
{"pokemon":"langがなっしー"}

応答きたきた。

req.query.ほげほげ でクエリ内容が見れて、応答書くだけなので楽だなあ。

参考情報