データベースのとあるテーブルの全データを返すだけのWebAPIを作りたい
そんなケースあるか?!
と思われるかもしれませんが、大規模アプリ開発でなければ「簡単なSQLで済む」ケースはあり得ます。
となると、LaravelやDjangoのような大きなフレームワークでなくとも、「もっと手軽に」「最小のコスト」でバックエンドはやっつけちゃいたいわけす。
そんなときに活躍したのがNode.jsのExpressというwebフレームワークでした。
私のケースでは、「製造現場で、”いつ・誰が取った数値”か」を、ただDBに放り込むだけのアプリがあり、このデータを表示するために全データを返すだけのWebAPIを作りたかった。
ExpressでAPIを作ることで、MVC概念に悩まされることも無くサクッと目的のAPIが作れました。
動作環境
- node.js 8.9.4
- expresss 4.17.1
- node-mysql 2.18.1
- mriadb 5.5.57
Node.js Expressならわずか20行でWebAPIが作れる
結果から見ていきましょう。
冒頭で述べた「あるテーブルの全データを返すだけのAPI」のコードです。
var express = require('express');
var app = express();
var mysql = require('mysql');
var connection = mysql.createConnection({
host: '192.168.11.xxx',
user: 'user_name',
password: 'user_password',
database: 'database_name'
});
app.get('/api', function (req, res) {
connection.query('select * from target_table', function (error, results, fields) {
if (error) throw error;
res.send(results);
});
});
app.listen(9000, function () {
console.log('OK');
});
SQLも直書きで、わずか20行。
本当の”お手軽”が実感できます。
上記のexpressのプログラム作成後、ターミナルで下記コマンドを叩けば設定したポート(例:192.168.11.xxx:9000/api)にDBから返されたjsonデータが現れます。
node index.js
サーバー起動前にexpressとmysqlクライアントのインストールは必須です。
expressとmysqlクライアントのインストール手順
npmコマンドでサクッと入れちゃいましょう。
npm i express
npm i mysql
動作環境にnode.js 8.9という古めのバージョンしか入れれなかったので、expressが入るのかヒヤりとしましたが、難なくインストール完了。
あとはフロントにデータを渡すなりなんなりと、ですね^^
私はフロントはNuxt.js × Vuetifyでデータ閲覧と検索機能を実装しました。
今回Expressで立てたAPIをNuxt側から叩くにはちょっと設定(CORSエラーの回避)が必要になります。興味のある方はこちらをご覧ください。Laravel × Nuxtの記事ですが、Nuxt側でやることは同じです。
【解決済】Docker上のNuxtでaxiosのCORSエラーにハマりまくった話
また、同じサーバーでも違うポート番号からAPIを叩く場合は、node-expresss側にもCORSの設定が必要になるケースがあります。
その場合は以下のコードをapp.get()の前に追記します。
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
これでCORSエラーが回避されます。
Expressは何よりも環境構築でつまづかない点が一番うれしい!
LaravelもDjangoもインストールやDB連携で随分苦労した記憶があり、そのあとモデルやコントローラーの設定・・・となると、やる気が消滅しますよね。nodeはフロントエンド開発でも使うので既に環境があり、npmなどでのライブラリのインストールも困ることは無かったのでした。
おまけ:expressサーバーを永続化する
SSH接続先で >node index.js などのコマンドを叩き、SSHを抜けた後もAPIを起動したままにしたい場合に使えるコマンドがあります。
nohup
というコマンドで、ssh接続が切れたあともハングアップ信号を無視し、プログラムを実行し続けるためのコマンドのようです。
使い方は簡単。今回のexpressサーバーの例で言えば
nohup index.js &
となります。
最後の「&」はプログラムをバックグランドで起動するオプション。nohupでSSH切断後もサーバーを起動させておくためには必須となります。
再ログイン後にnohup設定したプログラムを終了したい場合は、
lsof | grep :9000
で、起動したプログラムのPIDをポート番号(例:9000)から調べ、
kill -kill PID
で終了したいプログラムのPIDを指定して終了します。
nohupコマンドが無い場合
稀なケースで nohup コマンドが使えない場合があります。(QNAP NASにはnohupコマンドがありませんでした)
こういった場合にも対処法があって、使えるコマンドは disown です。
使い方はこちらも簡単。
node index.js & // バックグランド起動
jobs // 永続化したいプログラムのジョブ番号を調べる
disown -h %1 // %の後の数字はジョブ番号
または、
node index.js & disown
これで、SSH切断後もサーバーが起動されたままとなります。
disownコマンドを使った場合も、プログラムの止め方はnohupのときと同じですね^^
参考にしたドキュメント・ブログ記事
当APIを作るにあたって、下記の内容を参考にしました。
Qiita:Node.jsとExpressとMySQLの簡単サンプル
Qiita:expressにてCORSを許可する
【 disown 】コマンド――シェルのジョブテーブルからジョブを削除する
さいごに
最初はPythonでWebAPIを作ろうと思ってたのですが、FAST APIにしろFLASKにしろモデルの定義やORMの習得が煩わしく、「これらを使うなら慣れているLaravelと変わらんな~」と思ったところからExpressに行き着きました。
幸いにもjavascriptは少し慣れていたこともあり、pythonやphpなどの言語を行き来することなく目的のAPIを非常に簡単に作れ時短になりました。
ただ今回のような数行のSQLを直書くAPI作成は割とレアで、CRUD処理をすべて実装するようなケースでは慣れてきたLaravelを使うだろうと思います。
webのフレームワークも適材適所というところですね^^
コメント