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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

Node.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

651閲覧

Node.js Javascript 関数外での変数使用

whiz

総合スコア15

Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

Node.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2019/04/23 10:17

編集2019/04/23 12:24

Node.js
Electron
msnodesqlv8
SQLServer2017 EXPRESS

前提・実現したいこと

SQLServerからデータを参照するElectronアプリを開発しています。
下記のようなソースでrows[0]の値が代入された変数testをsql.queryの外で使用するにはどのようにしたら良いでしょうか?

該当のソースコード

sql.js

const sql = require("msnodesqlv8"); const connectionString = "server=.;Database=Master;Trusted_Connection=Yes;Driver={SQL Server Native Client 11.0}"; const query = "SELECT name FROM sys.databases"; sql.query(connectionString, query, (err, rows) => { console.log(rows); var test = rows[0]; }); console.log(test);

試したこと

return {test: test};
を関数内に記述し別の関数へ返り値で渡そうとしましたがうまくいきませんでした。

補足情報

Javascriptの知識が乏しく見当違いな質問をしているかもしれませんがご教授よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

変数を関数外で宣言すれば良いだけだと思いますが…。

js

1var test; 2 3sql.query(connectionString, query, (err, rows) => { 4 console.log(rows); 5 test = rows[0]; 6}); 7 8console.log(test);

ただし、非同期処理が発生することで test = rows[0] より console.log(test) が先に実行されるケースもあると思います。
その場合は工夫してください。

投稿2019/04/23 10:39

編集2019/04/23 10:42
mather

総合スコア6753

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

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

miyabi-sun

2019/04/23 10:59

> 非同期処理が発生することで test = rows[0] より console.log(test) が先に実行されるケースもあると思います。 JSやNode.jsの非同期処理はイベントループの仕様の関係で「必ず」後になります。 従って同期か非同期かという情報は死ぬほど重要なので回答する際は絶対に抑える必要があります。 因みにsqlのライブラリがコールバック関数を求めるかつ、 コールバック関数の第一引数がerrである点を考慮すると、 ほぼ確実に非同期処理である事が分かります。
mather

2019/04/23 11:10

> 変数testをsql.queryの関数外で使用するにはどのようにしたら良いでしょうか? この質問に対する回答です。 実際には変数がスコープに入っただけで求める値は表示されないでしょうね。 意地悪かもしれませんが、おそらく非同期処理そのものに馴染みがないのではないかと感じたので一つずつ解決するべきかと思いました。
whiz

2019/04/23 12:27

ご回答ありがとうございます。 質問文を修正致しました。 またconsole.log(test)が先に実行されるという事も確認致しました。
guest

0

自己解決

https://teratail.com/questions/68195
上記を参考に

function oya(callback){ const sql = require("msnodesqlv8"); const connectionString = "server=.;Database=Master;Trusted_Connection=Yes;Driver={SQL Server Native Client 11.0}"; const query = "SELECT name FROM sys.databases"; sql.query(connectionString, query, (err, rows) => { console.log(rows); let test = rows;       callback(test); }); } child = function(test) { console.log(test); } oya(child);

としたところtestを渡すことができました。
ありがとうございました。

投稿2019/04/24 00:36

編集2019/04/24 02:27
whiz

総合スコア15

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

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

mather

2019/04/24 01:54

えっ、本当にそのコードで渡せてますか? oyaの引数のcallbackが一度も呼び出されてませんが…。
whiz

2019/04/24 02:28

失礼しました。 不足コード追加しました。 ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問