LoginSignup
0
0

More than 1 year has passed since last update.

Node.jsとMySQLをつなぐ際、npmの種類にご注意を(2022/09/06現在)

Posted at

エラーの概要

https://prog-8.com/docs/nodejs-mysql
↑こちらのページはNode.jsとMySQLをつなぐための各ステップを丁寧に解説しており大変参考になります。が、こちらのページでインストールしているのはMySQLのバージョン5であり、上記の手順通りにバージョン8.0での接続を行おうとした場合、エラーが生じます。
https://juncleit.com/?p=410
上記ページで紹介されていた対策方法の繰り返しになりますが、現在(2022/09/06)も
問題なくその方法でエラーが解決できたよ、という追認として公開しておきます。

実際のエラー文

バージョン8でnpmの「mysql」をインストールしたのち、「リクエストを受けてMySQLへの接続を行い、成功すればコンソールに成功と出力する」といった内容のファイル(app.js)を起動しようとすると、以下のエラーが。

C:\Users\User>cd C:\Users\User\Desktop
	
C:\Users\User\Desktop>cd list-app

C:\Users\User\Desktop\list-app>node app.js
error connecting: Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support aut
hentication protocol requested by server; consider upgrading MySQL client
    at Handshake.Sequence._packetToError (C:\Users\User\Desktop\list-app\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14)
    at Handshake.ErrorPacket (C:\Users\User\Desktop\list-app\node_modules\mysql\
lib\protocol\sequences\Handshake.js:123:18)
    at Protocol._parsePacket (C:\Users\User\Desktop\list-app\node_modules\mysql\
lib\protocol\Protocol.js:291:23)
    at Parser._parsePacket (C:\Users\User\Desktop\list-app\node_modules\mysql\li
b\protocol\Parser.js:433:10)
    at Parser.write (C:\Users\User\Desktop\list-app\node_modules\mysql\lib\proto
col\Parser.js:43:10)
    at Protocol.write (C:\Users\User\Desktop\list-app\node_modules\mysql\lib\pro
tocol\Protocol.js:38:16)
    at Socket.<anonymous> (C:\Users\User\Desktop\list-app\node_modules\mysql\lib
\Connection.js:88:28)
    at Socket.<anonymous> (C:\Users\User\Desktop\list-app\node_modules\mysql\lib
\Connection.js:526:10)
    at Socket.emit (node:events:513:28)
    at addChunk (node:internal/streams/readable:315:12)
    --------------------
    at Protocol._enqueue (C:\Users\User\Desktop\list-app\node_modules\mysql\lib\
protocol\Protocol.js:144:48)
    at Protocol.handshake (C:\Users\User\Desktop\list-app\node_modules\mysql\lib
\protocol\Protocol.js:51:23)
    at Connection.connect (C:\Users\User\Desktop\list-app\node_modules\mysql\lib
\Connection.js:116:18)
    at Object.<anonymous> (C:\Users\User\Desktop\list-app\app.js:11:12)
    at Module._compile (node:internal/modules/cjs/loader:1126:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1180:10)
    at Module.load (node:internal/modules/cjs/loader:1004:32)
    at Function.Module._load (node:internal/modules/cjs/loader:839:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_ma
in:81:12)
    at node:internal/main/run_main_module:17:47

^C

あっさりした解決法

これは、npmファイルを「mysql」でなく「mysql2」というまた別のものに変えるという手段で回避できるようです。

C:\Users\User\Desktop\list-app>npm uninstall --save mysql 
/*元々使っていたパッケージであるmysqlをインストール*/

removed 12 packages, and audited 74 packages in 7s

9 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

C:\Users\User\Desktop\list-app> npm install --save mysql2
/*続いてMySQL8.0もちゃんと扱えるパッケージMysql2をインストール*/

added 14 packages, and audited 88 packages in 14s

9 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

また、npmを変えた影響でapp.jsの方にも少し変更が必要です。
具体的には、require('');の中身をmysqlからmysql2に変更しています。

app.js
const express = require('express');
/*require('');の中身を、mysqlからmysql2に変更*/
const mysql =require('mysql2');

const app = express();

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'x356393x',
  database: 'Q_list'
});
connection.connect((err) => {
  if (err) {
    console.log('error connecting: ' + err.stack);
    return;
  }
  console.log('success');
});

app.use(express.static('public'));
app.get('/', (req, res) => {
  res.render('hello.ejs');
});

app.get('/sql', (req, res) => {
  connection.query(
    'SELECT smallQ FROM questions',
    (error, results) => {
      console.log(results);
      res.render('hello.ejs');
    }
  );
});

app.listen(3000);

質問を記録したデータベースであるQ_listデータベースのquestionsテーブルからカラムsmallQを呼び出しています。さて結果は。

C:\Users\User\Desktop\list-app>node app.js
success
[
  { smallQ: 'なぜ勉強せねばならないのか' },
  { smallQ: '勉強以外ではダメなのか' },
  { smallQ: 'どんな状況でそれが言われるか' },
  { smallQ: '生きているならば既に勉強している?' },
  { smallQ: 'なぜ「すべきこと」をすべきか' }
]

無事呼び出しに成功です。
ご紹介したページでは「Queryを実行する関数をquery()からexecute()に変更する」
という変更も必要、とされていましたが今回やってみたところqueryのままでも実行出来ました。
以上です。読んでいただきありがとうございました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0