2017-03-01 1 views
1

ローカルデータベースにクエリを実行し、その結果をGoogleスプレッドシートに送信するスクリプトを作成しようとしています。私が現在立ち往生していて助けを求めているところは、私の質問の結果をどうやって得るのかです。NodeJS - GoogleスプレッドシートへのSQL結果の送信

var myQuery = []; 

function runQuery(query, callback) { 

    client.connect(function (err) { 
    if (err) throw err; 

    client.query(query, function (err, result) { 
     if (err) { 
     console.log(err); 
     } 

     callback({ result: result }); 

     client.end(function (err) { 
     if (err) throw err; 
     }); 
    }); 
    }); 
} 

runQuery('SELECT item_number FROM item WHERE item_number LIKE \'11-%\' LIMIT 10', function (resultsObject) { 
    myQuery = JSON.stringify(resultsObject.result.rows); 
    console.log('Did stringify work?'); 
    console.log(myQuery); 
}); 

console.log(myQuery); 

マイ出力:私は何が起こっているかを理解すると思う

Info: Start process (3:46:11 PM) 
[] 
Did stringify work? 
[{"item_number":"11-0011"},{"item_number":"11-0012"},{"item_number":"11-1255"},{"item_number":"11-0052"},{"item_number":"11-0060"},{"item_number":"11-1256"},{"item_number":"11-1281"},{"item_number":"11-0659"},{"item_number":"11-0660"},{"item_number":"11-0054"}] 
Info: End process (3:46:12 PM) 

、変数MYQUERYの範囲を設定して印刷によってRunQuery関数内だけで罰金が、その関数の外で、それは実際にされていませんさセット。これをどうやって回避するのですか?

JavaScriptとNodeJSの新機能ですので、正しい用語を使用したいと思います。

ありがとうございます!

答えて

1

空のmyQueryは、実際に値を入力する前にすでにコンソールされています。この問題はJavascriptの非同期メカニズムによって発生します。結果で何かをしたい場合は、コールバック関数を使用する必要があります。 runQueryの結果にアクセスしたときと同じように。

これを行うもう1つの方法は有望です。いくつかの関数で約束を返すことができ、約束を使って結果にアクセスすることができます。あなたが約束を使用する場合

が、ここのコードです:

function getresult(parameters) { 
    return new Promise((resolve, reject) => { 
     runQuery(parameter, resolve, reject); 
    }); 
} 

この機能を使用すると、によってRunQueryへのコールバックとして決意を渡されました。 runQueryでerrを捕捉する別のerrコールバック関数を追加する必要があります。約束では、拒否を誤ったコールバックとして使用します。

あなたは結果で何かをしたい:

getresult(parameters) 
.then((result) => {put your code here. result variable is your result}) 
.catch((err) => {do whatever with err}); 
+0

ここでは良い指示です:http://exploringjs.com/es6/ch_promises.html – zhangjinzhou

0

これはスコープの問題ではありません。それはタイミング問題です。クエリには時間がかかります。 JavaScriptは非ブロッキングであり、非同期プロセスを開始し(実際にはすべてのI/O操作のようなDBクエリを実行して)、結果を後で返します。コードでは、データが利用可能になると実行されるコールバックを使用しています。このことを念頭に置いて、あなたのコードを考えるための方法は、あなたがこの順番で物事をやっているということですので、

、:

1)あなたの関数runQueryを宣言 - JavaScript関数の宣言にに移動されているので、これは最初に起こりますスクリプトの先頭(hoistingというプロセス) 2)変数myQueryが確立され、空の配列に初期化されます 3)クエリはrunQueryの呼び出しによって開始されます。これはのみ5)いくつかの時間後にクエリが完了 を実行されるスクリプトの最後でプロセス 4)あなたのconsole.log(myQuery)を開始し、あなたのコールバックがあなたの他にconsole.log()が返されたデータを示していたデータと呼ばれる

関連する問題