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

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

新規登録して質問してみよう
ただいま回答率
85.50%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Node.js

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

1回答

3906閲覧

node.js SQL server 接続後のreturnができない

h_h0323

総合スコア14

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Node.js

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/08/12 09:30

nodejsにてsql serverに接続後データを取得し、returnで値を返したいのですが、returnができず値がundefinedになります。

returnで値を返す方法を教えていただけますでしょうか。

lang

1var count = function() { 2 connection.then(function(){ 3 sql = "SELECT count(*) as cnt FROM hogehoge"; 4 new mssql.Request().query(sql).then(function(results) { 5 if(results.length > 0){ 6 return results[0].cnt; 7 } 8 }).catch(function(err) { 9 console.log(err); 10 }); 11 }); 12}

おわかりの方がいらっしゃいましたらご教示お願いします。

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

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

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

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

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

guest

回答1

0

Promiseを使った非同期処理なので、returnで返すことはできません。

countを使う関数をコールバック関数として渡しておく、
Promiseを自体を返して、thenの中で処理をするなどといった処理を書く必要があります。

Promise自体の説明はここでは無理ですが、簡単に何が起きているか書くと、
countのfunctionが呼ばれた時、connection.thenは非同期で実行される(ブロックされない)のでcount関数はthenの行をすぐにぬけてなにもreturnしないままに終了しています。
その後(count関数の実行が終わった後)、connection.thenの中のfunctionは、connectionの非同期処理が終わった後に呼ばれています。

コールバックの方のコードを示しておきます。

javascript

1// コールバック関数を用意する 2var myCallback = function(count){ 3 // カウントが取れたら実行したいこと 4 5} 6 7// コールバックを渡しておく 8var count = function(myCallback) { 9 connection.then(function(){ 10 sql = "SELECT count(*) as cnt FROM hogehoge"; 11 new mssql.Request().query(sql).then(function(results) { 12 if(results.length > 0){ 13 // コールバックを呼ぶ 14 myCallback( results[0].cnt ); 15 } 16 }).catch(function(err) { 17 console.log(err); 18 }); 19 }); 20}

ちょっと余談ですが、Promiseをreturnすればthenで順次解決していくことができますので、
元のコードは以下の様にできそうに思います(すいませんが、実際に動かしてないので)

javascript

1var count = function() { 2 connection.then(function(){ 3 sql = "SELECT count(*) as cnt FROM hogehoge"; 4 // ここで queryもPromiseを返している様なので、 returnしてしまう。 5 return new mssql.Request().query(sql); 6 }) 7 .then(function(results) { 8 // queryが終わったら実行される 9 if(results.length > 0){ 10 // results[0].cnt を使った処理を書く 11 } 12 }) 13 .catch(function(err) { 14 // このcatchはconnectionの失敗でも取れると思います 15 console.log(err); 16 }); 17}

本当は、queryのthenの中で自分でPromise作って・・・などもできるんですが、
ここで説明しきれる内容ではないので割愛します。

投稿2016/08/12 11:43

flied_onion

総合スコア2604

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問