質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

1回答

1156閲覧

MySQLにNode.jsから接続できない

shinchoroX

総合スコア17

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

0クリップ

投稿2022/12/27 10:44

編集2022/12/27 11:39

前提

Mac M1シリコン環境で、Vscodeを用いて、学習を行っています。
Udemyの講座のハンズオンをしています。

mysql Ver 8.0.31 for macos13.0 on arm64 (Homebrew)
node v18.12.1

発生している問題・エラーメッセージ

vscodeのデバッグコンソール上に以下のメッセージが出ます。
vscode上で、デバッグ実行後に、ブラウザソフトでアクセスしようとするとエラーが発生する。
トップページにはアクセスできるので、接続は問題ないと考えています。

[2022-12-27T19:29:19.407] [INFO] application - Application listening at :3000

とブラウザでトップぺージにアクセス時に、vscode上で表示されていることからもわかります。

[2022-12-27T19:30:14.555] [ERROR] application - connect ECONNREFUSED 127.0.0.1:3306 Uncaught Error Error: Cannot enqueue Quit after fatal error. at _validateEnqueue (undefined:212:16) at Protocol._enqueue (undefined:138:13) at quit (undefined:91:23) at end (undefined:239:18) at <anonymous> (undefined:364:7) at end (undefined:350:12) at <anonymous> (undefined:34:23) at processTicksAndRejections (undefined:95:5)

試したこと

まず最初のエラーは以下のサイトを参考に、MySQL 8.0 に合わせた認証方式に変更しました。
https://reigle.info/entry/2022/07/24/100000

がエラーが出るので、以下を参考にしました。
https://geniusium.hatenablog.com/entry/2022/08/20/210202

udemyの講座は基本的にwindows環境での講座ですが、「Macではローカルホストが・・・」と言及しており、ソースコード内でも
localhostは使用せずに127.0.0.1になっています。

※追記 ソースコード(抜粋)
udemyの写経です。
(web開発系の言語が初めてのため)

client.js

1const { promisify } = require("util"); 2const path = require("path"); 3const { sql } = require("@garafu/mysql-fileloader")({ root: path.join(__dirname, "./sql") }); 4const config = require("../../config/mysql.config.js"); 5const mysql = require("mysql"); 6const con = mysql.createConnection({ 7 host: config.HOST, 8 port: config.PORT, 9 user: config.USERNAME, 10 password: config.PASSWORD, 11 database: config.DATABASE 12}); 13const MySQLClient = { 14 connect: promisify(con.connect).bind(con), 15 query: promisify(con.query).bind(con), 16 end: promisify(con.end).bind(con) 17}; 18 19module.exports = { 20 MySQLClient, 21 sql 22};

mysql.config.js

1module.exports = { 2 HOST:process.env.MYSQL_HOST || "127.0.0.1", 3 PORT:process.env.MYSQL_PORT || "3306", 4 USENAME:process.env.MYSQL_USENAME || "root", 5 PASSWORD:process.env.MYSQL_PASSWORD ||"******", 6 DATABASE:process.env.MYSQL_DATABASE ||"tastylog" 7};

パスワードは一応伏せ字にしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinchoroX

2022/12/27 11:37

ありがとうございます。 URL先もしっかりと読んでみます。 また、ソースコードは該当箇所(と思われる箇所)を追加しました。 Mac環境やweb開発系は初めてであり、トンチンカンなことを言っているかもしれませんが・・・ (一応組み込みでC言語と、ラズベリーパイでLinuxとPythonは少しの経験がある程度です)
guest

回答1

0

ベストアンサー

Node.jsのmysqlライブラリは作者が捨てました。

mysqlライブラリを使い続ける上で一番辛いのが、
MySQL8系に認証が通らないことですね。
この辺はググれば情報が出てくるので気になったら調べてみてください。

そしてmysql2ライブラリというプロジェクトを立ち上げてそちらで開発しています。
使い方はほぼ全て同じですし、Promiseを使った新しい方式にも対応しています。
そしてmysqlでは対応していなかったMySQL8系にも普通にログインして使う事ができます。

よほどの理由が無い限りはさっさと乗り換えましょう。

bash

1$ npm install mysql2

js

1const { promisify } = require("util"); 2const path = require("path"); 3const { sql } = require("@garafu/mysql-fileloader")({ root: path.join(__dirname, "./sql") }); 4const config = require("../../config/mysql.config.js"); 5 6// ここをmysql2ライブラリを使うようにする 7const mysql = require("mysql2"); 8 9// 後の使い方は同じ

一旦これで様子を見てください。


const { promisify } = require("util");

これPromise使おうとしてるんですね。
mysql2はPromiseにネイティブ対応しているのでそちらを共有します。

参考リンク

js

1const { promisify } = require("util"); 2const path = require("path"); 3const { sql } = require("@garafu/mysql-fileloader")({ root: path.join(__dirname, "./sql") }); 4const config = require("../../config/mysql.config.js"); 5 6// Promise対応版はJSファイルレベルで分離されている 7const mysql = require("mysql2/promise"); 8 9// await構文を使う為にasync関数を定義する 10const main = async () => { 11 // connection作る時、Promiseで受け取る仕組みになっているのでasync関数の中でawait構文を使いつつ代入 12 const c = await mysql.createConnection(config); 13 const [rows] = await c.query('SELECT * FROM users'); 14 console.log(rows); 15} 16main();

投稿2022/12/27 12:23

編集2022/12/28 01:33
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinchoroX

2022/12/28 00:28

ありがとうございます。 解決しました!! 本当にありがとうございます。 そんな背景があるのですね・・・ とても勉強になりました。 ただ、別のエラー Uncaught Error Error: Can't add new command when connection is in closed state が発生したので、エラー文からググってみて、コネクションエンドっぽいところを消すと、表示はできたのですが、一度アクセスするとError: connect ECONNREFUSED 127.0.0.1:3306とvscodeが止まりました。 が、今回のスレッドの問題ではないので、もう少しnodeとmysqlを勉強してから質問します。 hoshi-takanori様もアドバイスありがとうございました。とても助かりました。
shinchoroX

2022/12/28 04:55

本当にありがとうございます! >Promise使おうとしてるんですね。 仰ってから「Promise」とはなんぞや?と調べ始めたレベルです。 udemyの講座も「webアプリを作ろう」とざっくりしたものですので、一度これは置いておいて、基礎から勉強します。(丁度仕事納めでもあるので) Node.jsの入門書は2冊購入しましたが、(Node.js超入門、Node.jsフレームワーク超入門)、Javascriptから怪しいので(await等も)そちらも勉強します。 まずは、要素を切り出して地道に1つずつ自作サンプルを作ります。 (簡単なDB接続のみ等) 今回のudemyの講師の方が自作ライブラリ?のようなもので、SQL接続しているようで?(動画でさらっと言っていました)本質をしっかり理解して自分で作れるようにします。 ```app.js const PORT = process.env.PORT || 3000; const path = require("path"); const logger = require("./lib/log/logger.js"); const accesslogger = require("./lib/log/accesslogger.js"); const applicationlogger = require("./lib/log/applicationlogger.js"); const express = require("express"); const favicon = require("serve-favicon"); const app = express(); // Express settings app.set("view engine", "ejs"); app.disable("x-powered-by"); // Static resource rooting. app.use(favicon(path.join(__dirname, "/public/favicon.ico"))); app.use("/public", express.static(path.join(__dirname, "/public"))); // Set access log. app.use(accesslogger()); // Dynamic resource rooting. app.use("/", require("./routes/index.js")); app.use("/test", async (req, res, next) => { const { MySQLClient, sql } = require("./lib/database/client.js"); var data; try { await MySQLClient.connect(); data = await MySQLClient.query(await sql("SELECT_SHOP_BASIC_BY_ID")); console.log(data); } catch (err) { next(err); } finally { await MySQLClient.end(); } res.end("OK"); }); // Set application log. app.use(applicationlogger()); // Execute web application. app.listen(PORT, () => { logger.application.info(`Application listening at :${PORT}`); }); ```
shinchoroX

2022/12/28 04:57

その時に教えて頂きましたmusql2を用いて接続を試みます。 学習の指針ができました。 本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問