前回のお話
せっかくデータを作成したので、読み取り側も作成したいと思います。
今回はexpressで作成します。
expressの導入
とりあえず新規に作業用フォルダを作ります。
express-mysqlとしました。
npm initからexpressをインストールします。
$ npm init
~中略~
$ npm install express --save-dev
次に作業フォルダにindex.jsを作成し、動作確認します。
const express = require("express");
const app = express();
app.get("/", function(req, res) {
res.send("Hello World!");
});
app.listen(3000, () => {
console.log('Go to http://localhost:3000/ to view page');
});
node index.jsで実行し、localhost:3000にアクセスしてHello World!と表示されていれば成功です。
node.jsでMySQLを操作する
次に、JSでMySQLを操作できるよう、MySQL用のパッケージを用意します。
https://www.npmjs.com/package/mysql
$ npm install mysql --save-dev
これがあれば、JSファイルからMySQLサーバーにアクセスし、クエリの実行等々行うことができます。
便利です。
先ほどのindex.jsの3行目以下に、次のように記述を追加します。
const mysql = require("mysql");
const connection = mysql.createConnection({
host: "localhost",
user: "root",
password: "password",
database: "test"
});
host、user名等は適宜付け替えてください。
これで、connectionという変数で以降MySQLにアクセスできるようになります。
最後に、データを確認するため、簡易的に表示部分を追加します。
Hello World!を返していたapp.get関数部分を、以下の様に書き換えます。
app.get("/", function(req, res) {
connection.query("select * from todos LIMIT 0, 10", error, results, fields) {
if (error) throw error;
res.send(results);
});
connection.end();
});
これで、localhost:3000にMySQLのデータが表示されていれば成功です。
MySQL8.0以降における注意
MySQL8.0からパスワードの認証方法が変更され、上に挙げたnpm標準パッケージでは未対応となっています(2018.11現在)。
そのため8.0以降のサーバーに上記の方法でそのままアクセスしようとすると、ER_NOT_SUPPORTED_AUTH_MODE:というエラーコードにより弾かれてしまいます。
解決策としては、こちらの方のパッケージを使用するか、
以下のやり方でMySQL側のユーザーパスワードをcaching_sha2_passwordからmysql_native_passwordに変更することが必要だそうです。
既存ユーザーの変更
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyNewPass';
もしくは、
新規ユーザーの作成
CREATE USER 'foo'@'localhost' IDENTIFIED WITH mysql_native_password BY 'bar';
下のやり方は若干力技な気がしますが、一応これで動作すると思われます。
(大人しく対応済みのパッケージを使用したほうが良いかも・・・)
※参考にしたのはこちら
https://stackoverflow.com/questions/50373427/node-js-cant-authenticate-to-mysql-8-0