Help us understand the problem. What is going on with this article?

MySQLメモその2

More than 1 year has passed since last update.

前回のお話
せっかくデータを作成したので、読み取り側も作成したいと思います。
今回はexpressで作成します。

expressの導入

とりあえず新規に作業用フォルダを作ります。
express-mysqlとしました。
npm initからexpressをインストールします。

$ npm init
~中略~
$ npm install express --save-dev

次に作業フォルダにindex.jsを作成し、動作確認します。

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行目以下に、次のように記述を追加します。

index.js
const mysql = require("mysql");
const connection = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "password",
  database: "test"
});

host、user名等は適宜付け替えてください。
これで、connectionという変数で以降MySQLにアクセスできるようになります。

最後に、データを確認するため、簡易的に表示部分を追加します。
Hello World!を返していたapp.get関数部分を、以下の様に書き換えます。

index.js
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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away