質問: _id; } connection.query(sql, function(err, rows) { if(err) throw err; consoe.log(rows[0].id); // ちゃんと出力される(データ取得は正常にできている) processResult(rows[0].id); return; }); return id; //返却されたidをconsoe.logするとnull担っている。 // { id: null } } ``` ### 補足情報(言語/FW/ツール等のバージョンなど) ・OS:MAC OS Sierra ・node v4.1.1 ・npm v5.0.3 ・ターミナル(bash)上で実行 ・mysqlは「github:mysqljs/mysql」
回答: mysqlの使い方の問題というよりは、失礼ながらnodejsの非同期処理に対する把握不足のように思います。 query関数は非同期処理をスタートするための関数です。setTimeoutのようなものをイメージしてみてください。ちょうどそういうものと同様の動きをします。この関数はDBMSへqueryを発行しますが、その完了を待たずに即座にreturnしてくるのです。ゆえにその後でreturn idとしてもそれはDBMSへの問い合わせ結果が得られていない状態でのidの値を返しているに過ぎないことになります。 そもそもDBMSへ問い合わせその結果を返すという関数(getItemId)の機能は(設計できなくはないですが)少々難しいと思います。 自分には非同期処理をどう扱うべきかを簡単にお伝えできないので、まず**Promise**について学び、それを用いて非同期処理をどのように書くか練習することをお勧めします。「nodejs Promise」で検索するとよい記事がtopにでてくると思います。