Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS-将SQL结果发送到Google工作表_Javascript_Node.js - Fatal编程技术网

Javascript NodeJS-将SQL结果发送到Google工作表

Javascript NodeJS-将SQL结果发送到Google工作表,javascript,node.js,Javascript,Node.js,我正在尝试编写一个脚本,将查询本地数据库,并将结果发送到谷歌电子表格。我目前遇到的问题是如何获得查询结果,我需要寻求帮助 var myQuery = []; function runQuery(query, callback) { client.connect(function (err) { if (err) throw err; client.query(query, function (err, result) { if (err) {

我正在尝试编写一个脚本,将查询本地数据库,并将结果发送到谷歌电子表格。我目前遇到的问题是如何获得查询结果,我需要寻求帮助

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非常新,所以我希望使用正确的术语


提前谢谢

在您实际将值放入空myQuery之前,它已经得到了处理。这个问题是由Javascript的异步机制引起的。如果要对结果进行处理,必须使用回调函数。就像从runQuery访问结果时所做的一样

另一种方法是承诺。您可以在某些函数中返回承诺,并使用该承诺访问结果

如果您决定使用promise,以下是代码:

function getresult(parameters) {
    return new Promise((resolve, reject) => {
        runQuery(parameter, resolve, reject);
    });
}
使用此函数,您将resolve作为回调传递给runQuery。您确实希望添加另一个err回调函数来捕获runQuery中的err。在promise中,您使用reject作为错误回调

当您希望对结果执行某些操作时:

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

这不是范围问题。这是一个时间问题。执行查询需要一些时间。JavaScript是“非阻塞”的,这意味着它将启动一个异步进程(比如执行DB查询——实际上是所有I/O操作),然后返回结果。在您的代码中,您正在使用一个回调,该回调在数据可用时运行

因此,考虑到这一点,思考代码的方法是按照以下顺序进行操作:

1) 声明您的函数
runQuery
-这首先发生,因为在JavaScript中,函数声明被移动到它们所在脚本的顶部(一个称为
提升
的过程) 2) 已建立并初始化变量myQuery(到空数组) 3) 您的查询通过调用
runQuery
开始;这只会启动这个过程 4) 脚本末尾的
console.log(myQuery)
已运行 5) 一段时间后,查询完成,您的回调将被调用,其中您的另一个console.log()显示返回的数据