クモのようにコツコツと

フロントエンドエンジニア イイダリョウの技術ブログ。略称「クモコツ」

【Epxress】データベース接続の比較(MySQLとMongoDB)

Expressシリーズ久々に再開です。以前、静的なHTMLファイルを表示するWebサーバを立てました。今回からデータベース編です。少し前にMySQLやMongoDBにターミナルから接続しましたが、今回はExpressから接続したく思います。それではいきましょう!

【目次】

※参考:前回記事
【Express】静的HTMLファイルの表示(res.sendFile()、express.static()) - クモのようにコツコツと

※参考:Node.js / Expressを習得するためにやったことまとめ
qiita.com

データベースのおさらい

MySQLにターミナルからCRUDしてみた。
f:id:idr_zz:20200802183554j:plain

※参考:【SQL】ターミナルからMAMPのMySQLにCRUDする - クモのようにコツコツと

MongoDBもターミナルからCURDしてみた。 f:id:idr_zz:20200806080740j:plain

※参考:【NoSQL】ターミナルからMongoDBにCRUDする(JS & JSONライク!) - クモのようにコツコツと

今回はExpressからデータベースに接続してみたい。

MySQLへの接続

まずはMAMPのMySQLに接続する。参考にさせていただいた記事。

※参考:Express database integration

※参考:Express.js(node.js)からMySQLへの接続とCRUD操作 | アールエフェクト

Expressのインストール

まず「express_mysql」フォルダを作成し、cdコマンドで移動

cd /(パス)/express_mysql

npmのpackage.jsonを作成

npm init -y

Expressのインストール

npm install express --save

Expressのインストールの詳細はこちら

※参考:Express事始め(インストール〜ハローワールドまで) - クモのようにコツコツと


Node.jsを常時監視するモジュール「nodemon」(ドラえもんみたいな名前w)も入れてみる。

npm install nodemon -g

これは今後も使うのでグローバルにインストールした(以降はインストール不要)

※参考:nodemon

nodemonはgulpでいうwatch()メソッドみたいな位置づけ。

※参考:【Gulp】watch()メソッドでSass(SCSS)を自動コンパイル - クモのようにコツコツと

MySQLをインストール

次にMySQLのモジュールをインストール

npm install mysql

これはDB本体ではなく、Node.jsでmysqlを使えるようにするモジュール。

index.jsを作成する。MAMPを起動していない場合は起動する。

index.jsをnodemonから起動し、監視する。

nodemon index.js

これで修正内容がサーバに反映される。

JSコード

index.jsのコード

const mysql = require('mysql');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'beatles',
  port: 8889
});

connection.connect();

connection.query('SELECT id, name, part FROM member',
  (err, result) => {
    if (err) throw err;
    console.log(result);
});

connection.end();
  • 変数mysqlmysqlモジュールをインポート
  • 変数connectionmysql.createConnection()を実行
    引数は無名関数でMAMPのデータベースの接続情報
  • connection.connect()を実行、データベースに接続
  • connection.query() を実行、第一引数はSQL文のSELETCT
    第二引数は無名関数で引数は左からerr, result
    もしerrだったら処理を抜ける
    コンソールに結果resultを表示する
  • connection.end()で接続を終える

connection.query()の第一引数でSQL文を直接書いている。


なお、connectionのMAMPのDBの接続情報はこちらのページで確認できる。

http://localhost:8888/MAMP/?language=English

f:id:idr_zz:20200816113117j:plain

ポート番号8889も書かないとエラーになった。

※参考:NodeJSでMAMPのMySQLにアクセスする。 | 俺日記

結果の表示

index.jsを保存するとターミナルのコンソールに下記の結果が表示された!

f:id:idr_zz:20200816173532j:plain

[
  RowDataPacket { id: 1, name: 'ジョン・レノン', part: 'ギター' },
  RowDataPacket { id: 2, name: 'ポール・マッカートニー', part: 'ベース' },
  RowDataPacket { id: 3, name: 'ジョージ・ハリスン', part: 'ギター' },
  RowDataPacket { id: 6, name: 'リンゴ・スター', part: 'ドラム' }
]

MySQLのデータベースはテーブル形式だが、返された結果はJSON形式になっている!!

ソースコード
※参考:GitHub - ryo-i/express_mysql: ExpressでMySQLに接続

MongDBへの接続

次はNoSQLのデータベース「MongoDB」に接続してみる。参考にした記事

※参考:Express database integration

mongodbをインストール

「express_mongdb」というフォルダを作る。Expressのインストール〜nodemonの起動までは同じ流れ。

mongodbモジュールのインストール(MySQLと同じくDB本体ではない)。

npm install mongodb

index.jsを作成し、nodemonで監視する

nodemon index.js

JSコード

index.jsのコード

const MongoClient = require('mongodb').MongoClient;

const url = 'mongodb://localhost:27017/beatles';
const connectOption = {
    useUnifiedTopology: true
}

MongoClient.connect(url, connectOption, (err, client) => {
  if (err) throw err;
  const db = client.db('beatles');

  db.collection('member').find().toArray((err, result) => {
    if (err) throw err;
    console.log(result);
  });
});
  • 変数MongoClientmongodbMongoClientをインポート
  • 変数urlでデータベースbeatlesのURLを設定
  • 変数connectOptionでオプション(useUnifiedTopologytrue)を設定
  • MongoClient.connect()を実行、引数は左からurlconnectOption、無名関数(引数は左からerr, client
    もしエラーなら処理を抜ける
    変数dbclient.db()を実行、引数はbeatles db.collection()を実行(引数はmember)、find()でデータを表示、
    toArray()で配列形式に、引数は無名関数で無名関数の引数はerr, result
    もしエラーなら処理を抜ける
    コンソールに結果 resultを表示

元々のMongoDBの書き方がJSライクのため、自然に馴染んでいる。

find()の後につないでいるtoArray()はデータを配列形式にして返すメソッド。

※参考:https://docs.mongodb.com/manual/reference/method/cursor.toArray/


connectOptionのオプション値(useUnifiedTopologytrue)を加えないとこの警告文が出る。

(node:42192) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.

(ノード:42192)DeprecationWarning:現在のサーバー検出および監視エンジンは非推奨であり、将来のバージョンでは削除される予定です。 新しいサーバー検出および監視エンジンを使用するには、オプション{useUnifiedTopology:true}をMongoClientコンストラクターに渡します。

オプションの加え方は下記が参考になった。

※参考:【2019年版】Node.js + MongoDBでデータベース接続をする【Mac環境】 - Qiita

結果の表示

index.jsを保存するとターミナルのコンソールに下記の結果が表示された。

f:id:idr_zz:20200816173511j:plain

[
  { _id: 5f2b28d7bab508003e3acfe5, name: 'ジョン・レノン', part: 'ギター' },
  { _id: 5f2b28e5bab508003e3acfe6, name: 'ポール・マッカートニー', part: 'ベース' },
  { _id: 5f2b28ebbab508003e3acfe7, name: 'ジョージ・ハリスン', part: 'ギター' },
  { _id: 5f2b3784bab508003e3acfea, name: 'リンゴ・スター', part: 'ドラム' }
]

前回のターミナルからのCRUDとは少し書式が違うが、やはりJSON形式になっている!

ソースコード
※参考:GitHub - ryo-i/express_mongdb: ExpressにMongoDBで接続

最後に

ということでExpressからMySQLとMongoDBに接続できました。MySQLの操作はSQL文を書きましたが、返ってくるデータはJSON形式でした!MongoDBの操作はJSライクなのでやはり馴染んでますねw

今はまだデータを読み込んでターミナル(コンソール)に表示するのみですが、ブラウザと連携してCRUD操作もやってみたく。また、MySQLの操作をSQL文ではなくJSでできるORMツール「Sequelize」も使ってみたく思っています。

それではまた!


※参考:Node.js / Expressを習得するためにやったことまとめ
qiita.com