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

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

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

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

Azure

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

Q&A

解決済

2回答

2286閲覧

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

k.sonchi

総合スコア7

Node.js

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

Azure

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

0グッド

0クリップ

投稿2017/10/20 05:52

編集2017/11/13 11:31

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

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

JavaScript

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

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

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

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

そのイベントがいつ起きるのかは、コールバックを渡す関数次第です。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についてはよく知らないので何か間違っていたらすみません。

lang

1const query = require('./query-azure'); 2 3if (condition) { 4 queryAndDoSomething(params); 5} 6 7async function queryAndDoSomething(params) { 8 const result = await query(params); 9 // display result 10}

query-azure.js

lang

1// ... 2 3function query(params) { 4 return new Promise((resolve, reject) => { 5 6 // ... some callback nesting for connection and request 7 resolve(result); 8 // ... 9 } 10} 11 12module.exports = query;

投稿2017/10/20 08:01

karamarimo

総合スコア2551

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

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

k.sonchi

2017/10/24 01:29

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

0

自分も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

javascript

1function foo(x) { 2 console.log(`foo(${x}) called`); 3 return new Promise(resolve => { 4 const callback = () => { 5 console.log(`foo(${x}) resolved`); 6 resolve(x + 1); // 後段へ成功結果を伝達 7 } 8 setTimeout(callback, 1000); 9 }); 10} 11 12// async関数の中では非同期処理を同期的に書ける 13async function boo(x) { 14 let a = foo(x + 1); 15 let b = foo(x + 2); 16 console.log('add start'); 17 let c = await a + await b; 18 console.log('add completed'); 19 return c; 20} 21 22console.log('start'); 23boo(10).then((r)=>console.log('completed ' + r)); 24console.log('end');

(Node.js v7.9.0)

bash

1$ node test 2start 3foo(11) called 4foo(12) called 5add start 6end 7foo(11) resolved 8foo(12) resolved 9add completed 10completed 25

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

投稿2017/10/20 07:26

KSwordOfHaste

総合スコア18392

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

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

k.sonchi

2017/10/24 01:27

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問