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

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

ただいまの
回答率

91.02%

  • Node.js

    1548questions

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

  • Azure

    181questions

    Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

node.jsでDB取得を同期処理したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,243

k.sonchi

score 1

前提

Microsoft AzureでWebアプリを作成しています。
初めてnode.jsでコーディングしておりますが、
DB接続やデータ取得は下記のURLを参考に成功しました。
Node.js を使用して Azure SQL Database に照会する

実現したいこと

何らかの条件の時にDBからデータを取得して、
画面に取得値を出力したり、後続の処理で扱ったりしたいです。

//何らかの条件
if(foo == bar){
    //データ取得
    ret returnValue = queryDatabase(params);
    //取得したデータを基に処理を行う
    //Do Something
}

発生している問題・試したこと

node.jsは非同期で処理されることは理解しましたが、
上記URLの内容を同期で処理させる方法が分かりません。
await/async/promise などを使えば何とかなることまでは分かりましたが、
具体的にどのようにコーディングして、どのように値を受取れば良いかが分かりません。
(「コールバック」についてイマイチ理解出来ていません)

その他・要望

同期処理を行う方法を教えて頂きたい、に加えて、
DB関連処理はメインの app.js とは別のファイル(例:db.js)で管理したいです。
module.exports = XXX; を使えば良いことは分かりましたが、
その辺りも具体的に教えて頂けると嬉しいです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

(「コールバック」についてイマイチ理解出来ていません)

正確な定義は知りませんが「あるイベントが発生したときに実行してほしいことを書いた関数」みたいな感じです。なので一般にその関数は実際いつ呼ばれるか予測できません。

そのイベントがいつ起きるのかは、コールバックを渡す関数次第です。setTimeoutなら指定した時間後にコールバックが実行されますし、$.ajaxならリクエストしたデータを受け取ったときに実行されます。

上記URLの内容を非同期で処理させる方法が分かりません。
await/async/promise などを使えば何とかなることまでは分かりましたが、

おそらくtypoだと思うのですが、同期処理したいんですよね?

しかしawait/asyncpromiseは非同期処理を「同期処理っぽく」書くことはできますが非同期であることに変わりはありませんのでご注意ください。

おそらくreturnValue = queryDatabase(prams)のところでawaitを使いたいのだと思いますが、awaitasync functionの中でしか使えません。

KSwordOfHasteさんのおっしゃるようにまずはawait/asyncpromiseを理解してから使ったほうがよいと思います。

同期処理を行う方法を教えて頂きたい、に加えて、
DB関連処理はメインの app.js とは別のファイル(例:db.js)で管理したいです。
module.exports = XXX; を使えば良いことは分かりましたが、
その辺りも具体的に教えて頂けると嬉しいです。

今の場合こんな感じで分ければいいのではないでしょうか。
tediousはpromiseに対応してないので、自分でpromiseを作る必要があります。
Azure SQLについてはよく知らないので何か間違っていたらすみません。

const query = require('./query-azure');

if (condition) {
    queryAndDoSomething(params);
}

async function queryAndDoSomething(params) {
    const result = await query(params);
    // display result
}

query-azure.js

// ...

function query(params) {
    return new Promise((resolve, reject) => {

        // ... some callback nesting for connection and request
                    resolve(result);
        // ...
    }
}

module.exports = query;

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/24 10:29

    await/async の使用条件や export の使い方を具体的に教えて頂きありがとうございます。
    Promise について正しく理解してからコーディングしようと思います。

    キャンセル

+1

自分もNode.js初学者なのですが、

「コールバック」についてイマイチ理解出来ていません
await/async/promise などを使えば何とかなることまでは分かりました

自分の場合、上の状態からなんとか書けるまで結構あちこち見ながら勉強しましたがすんなりと書けるようにはなりませんでした。どう進めたかと言えば普通に以下をやりました。

  • まずはcallbackを用いるもっとも基本的なインターフェースでの非同期処理の書き方を学ぶ
    mysqlを例としてどういう感じになるかを試してみました。が、コールバックのネスト地獄に陥り「これはたまらん」となりすぐにPromiseを見始めました。
  • Promiseについて学び書いてみる
    解説や例をみれば考え方はわかるのですが、いざ自分で書こうとするとすぐ手が止まりました。非同期処理の起動、完了時の制御の移り方に慣れるまで解説ページに何度も目を戻しつ書いていた感じです。Promiseで書くと実感できますがcallbackよりずいぶんスッキリはしますが、それでもなおマルチスレッドの言語で同期的に書くことになれた身にはプログラムの制御構造が難しく見えました。
  • async/await
    https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function
    Promiseにある程度なれてくれば、上記のようなページでasync/awaitの説明をみると割合容易に理解できたと思います。

なお単純な例だと以下のような感じに書けます。(上のページにある例と似たようなものですが)

test.js

function foo(x) {
  console.log(`foo(${x}) called`);
  return new Promise(resolve => {
    const callback = () => {
      console.log(`foo(${x}) resolved`);
      resolve(x + 1); // 後段へ成功結果を伝達
    }
    setTimeout(callback, 1000);
  });
}

// async関数の中では非同期処理を同期的に書ける
async function boo(x) {
  let a = foo(x + 1);
  let b = foo(x + 2);
  console.log('add start');
  let c = await a + await b;
  console.log('add completed');
  return c;
}

console.log('start');
boo(10).then((r)=>console.log('completed ' + r));
console.log('end');


(Node.js v7.9.0)

$ node test
start
foo(11) called
foo(12) called
add start
end
foo(11) resolved
foo(12) resolved
add completed
completed 25

モジュールついてはあまり考えずにmodule.exportsで書きますが、アドバイスできる知識ないです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/24 10:27

    学習の手順について経験談を交えて教えて頂き、ありがとうございました。
    私も同じように学習してみようと思います。

    キャンセル

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

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Node.js

    1548questions

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

  • Azure

    181questions

    Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。