【超簡単!】node.jsのExpressでお手軽WebAPI作成方法【mysql編】

node.js express

データベースのとあるテーブルの全データを返すだけの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を作るにあたって、下記の内容を参考にしました。

Express 公式ドキュメント

npm msql ドキュメント

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のフレームワークも適材適所というところですね^^

よかったらシェアしてね!

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次
閉じる