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

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回答

3822閲覧

nodeでmysqlのデータを返却する関数が上手く作れない

yanagisawa

総合スコア9

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クリップ

投稿2017/06/21 12:11

###前提・実現したいこと
node.jsでmysqlに接続し、itemテーブルのidカラムを取得して
返却する関数を実装しないといけないんですが何度やってもうまくできません。。。

スコープの問題(?)で下記コードのid変数に代入できないのですが、どうやったら
うまく返却できるのか、考えても解決策が見つかりませんでした。。
誰かご教授ください。

###該当のソースコード

javascript

1const db_info = { 2 host: 'localhost', 3 user: 'root', 4 password: 'password', 5 port: 3306 6}; 7const mysql = require('mysql'); 8const connection = mysql.createConnection(db_info); 9 10 11function getItemId() { 12 var sql = 'SELECT * FROM item;'; 13 var id = null; 14 15 function processResult(_id) { 16 id = _id; 17 } 18 19 connection.query(sql, function(err, rows) { 20 if(err) throw err; 21 22 consoe.log(rows[0].id); // ちゃんと出力される(データ取得は正常にできている) 23 processResult(rows[0].id); 24 return; 25 }); 26 return id; //返却されたidをconsoe.logするとnull担っている。 27 // { id: null } 28}

###補足情報(言語/FW/ツール等のバージョンなど)
・OS:MAC OS Sierra
・node v4.1.1
・npm v5.0.3
・ターミナル(bash)上で実行
・mysqlは「github:mysqljs/mysql」

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

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

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

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

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

guest

回答1

0

ベストアンサー

mysqlの使い方の問題というよりは、失礼ながらnodejsの非同期処理に対する把握不足のように思います。

query関数は非同期処理をスタートするための関数です。setTimeoutのようなものをイメージしてみてください。ちょうどそういうものと同様の動きをします。この関数はDBMSへqueryを発行しますが、その完了を待たずに即座にreturnしてくるのです。ゆえにその後でreturn idとしてもそれはDBMSへの問い合わせ結果が得られていない状態でのidの値を返しているに過ぎないことになります。

そもそもDBMSへ問い合わせその結果を返すという関数(getItemId)の機能は(設計できなくはないですが)少々難しいと思います。

自分には非同期処理をどう扱うべきかを簡単にお伝えできないので、まずPromiseについて学び、それを用いて非同期処理をどのように書くか練習することをお勧めします。「nodejs Promise」で検索するとよい記事がtopにでてくると思います。

投稿2017/06/21 13:29

KSwordOfHaste

総合スコア18394

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

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

yanagisawa

2017/06/21 14:04

node初学者なもので、色々とありがとうございました。 勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問