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

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

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

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

Node.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

997閲覧

node.jsでのコネクション接続について

keets

総合スコア7

MySQL

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

Node.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/05/02 02:01

前提・実現したいこと

node.jsでMYSQLを操作する事を実現したいです。
1.コネクションを取得
2.SQLの実行処理
3.コネクションの接続を終了(または解放)

上記1~3までをDB共通モジュールとして記載して
呼び出し元に結果を返却をイメージしています。
※ コネクションを終了する際は返却は意識していません。

構成はNode.jsにExpressで生成した基本的な物となります。

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

通常のコネクション作成では一応成功したのですが、
コネクションプール、プールクラスターを使った接続で
コネクションの返却の結果がundefinedの為
後続の処理で失敗します。

該当のソースコード

db.js

var mysql = require("mysql"); var config = require('config'); var express = require("express"); module.exports = { connection: null, poolCluster: null, connect: function() { this.connection = mysql.createConnection(config.get('dbConfig')); return this.connection; }, connectPool: function() { this.poolCluster = mysql.createPoolCluster(); this.poolCluster.add('MASTER', config.get('dbConfig')); this.poolCluster.add('SLAVE1', config.get('dbConfig2')); this.poolCluster.add('SLAVE2', config.get('dbConfig3')); this.poolCluster.getConnection('SLAVE*', 'RANDOM', function (connection) { console.log(con.config.database); // if(err != null){ // //失敗 // console.log('ERROR'); // console.log(err); // return; // } console.log('connected'); co = connection; return connection; }); console.log('test'); }, connectPool2: function() { // プロミスを使ったコネクション return new Promise(function(resolve, reject) { this.poolCluster = mysql.createPoolCluster(); this.poolCluster.add('MASTER', config.get('dbConfig')); this.poolCluster.add('SLAVE1', config.get('dbConfig2')); this.poolCluster.add('SLAVE2', config.get('dbConfig3')); this.poolCluster.getConnection(function (err, con) { console.log(con.config.database); if(err != null){ // 失敗 console.log('ERROR'); console.log(err); return; } console.log('connected'); resolve(con); }); console.log('test1'); }); }, errorHandler: function(err) { if (err) { throw new Error(err); } }, queryExec: function(con, query, params, callback) { var self = this; console.log(con.config.database); console.log('query exec'); con.query(query, params, function(err, rows) { self.errorHandler(err); // return rows; callback(rows); }); }, conEnd: function(con) { console.log('Connection end); // con.release(); con.end(); }, conRelease: function(con) { console.log('Connection release'); con.release(); // con.end(); } };

呼び出し元のjs

var express = require("express"); var mysql = require("../common/db2.js"); let router = express.Router(); let query = 'SELECT * FROM test; let result, con, result2, con2; let row, row2; // DB接続と取得 // 通常のコネクション接続 con = mysql.connect(); console.log('con: ' + con); mysql.queryExec(con,query,[]) .then((result) => { row = result; console.log('test: ' + row); }); mysql.conEnd(con); // コネクションプールクラスターの接続 con = mysql.connectPool(); // ここがundefined console.log('con2: ' + con2); mysql.queryExec(con,query,[]) .then((result) => { row2 = result; console.log('test2: ' + row2); }); mysql.conRelease(con); // 画面表示 router.get("/", function(req, res, next) { res.render("test", { data: row2, title: テスト' }); }); module.exports = router;

色々なサイトを調べた結果
上記の様なコードで実行しています。

まだ経験が不足している為、
何故返却結果が返ってきていないのか
ちゃんと理解していないと思っています。

理解している方にどうすればいいのか
と悩んでいます...。

宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Node.jsでのMySQLの操作は、基本的に非同期となっています。なので、関数Aの中からMySQLの関数を呼び出しても、その実行結果が得られる前に、関数Aが終了してしまいます。

こういったものを扱うには、Promiseでラッピングする必要があります。

投稿2018/05/02 02:16

maisumakun

総合スコア145184

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

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

keets

2018/05/02 03:49

getConnectionを呼び出す際に、Promiseでラッピングすれば 正しく結果が取得出来ると言う認識で合ってますでしょうか? 非同期が問題かと思ってPromiseを使ったconnectPool2を使ってみたんですけど ステータスがPending状態で中身が入ってなかったので気がついてませんでした・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問