NodeJS – 发送SQL结果到Google表格

我正在尝试编写一个脚本来查询本地数据库并将结果发送到Google Spreadsheet。 在哪里我目前卡住,寻求帮助是如何得到我的查询结果。

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) 

我想我明白发生了什么事情,variablesmyQuery的范围被设置和打印在runQuery函数内,但是在该函数之外,它并没有被真正设置。 我如何解决这个问题?

JavaScript和NodeJS非常新,所以我希望我使用正确的术语。

提前致谢!

在你真的把值放入它之前,空的myQuery已经被安慰了。 这个问题是由Javascript的asynchronous机制造成的。 如果你想对结果做些什么,你必须使用callback函数。 就像你从runQuery访问结果时所做的一样。

另一种做法是承诺。 你可以在某个函数中返回一个promise,并使用promise来访问结果。

如果你决定使用承诺,这里是代码:

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

使用这个函数,你将callback传递给runQuery。 你想添加另一个errcallback函数来捕获runQuery中的err。 在承诺您使用拒绝作为犯错callback。

当你想要做的事情的结果:

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

这不是范围问题。 这是一个计时问题。 查询需要一些时间来执行。 JavaScript是非阻塞的,意味着它将启动一个asynchronous进程(就像做一个数据库查询 – 实际上是所有的I / O操作一样)并在稍后返回结果。 在您的代码中,您正在使用数据可用时运行的callback。

所以,考虑到这一点,思考你的代码的方式是你按照这个顺序来做事情:

1)声明你的函数runQuery – 这首先发生在JavaScript函数中,声明移到了它们所在脚本的顶部(一个叫做hoisting的过程)2)variablesmyQuery被build立并初始化(到一个空的数组)3)查询是通过调用runQueryrunQuery ; 这只是启动过程4)你的脚本的末尾你的console.log(myQuery)运行5)一段时间后,查询完成,你的callback调用与其他console.log()显示返回的数据