Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.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 为什么在使用pg时,如果我从函数返回查询结果,它会返回未定义的结果,但如果我将其记录在控制台日志中,它会打印出来?_Javascript_Postgresql_Return_Console.log_Node.js Pg - Fatal编程技术网

Javascript 为什么在使用pg时,如果我从函数返回查询结果,它会返回未定义的结果,但如果我将其记录在控制台日志中,它会打印出来?

Javascript 为什么在使用pg时,如果我从函数返回查询结果,它会返回未定义的结果,但如果我将其记录在控制台日志中,它会打印出来?,javascript,postgresql,return,console.log,node.js-pg,Javascript,Postgresql,Return,Console.log,Node.js Pg,这是我的代码: const queryFirstNames = function (qString) { let firstNameMatches; client.query('SELECT * FROM famous_people WHERE first_name = $1', [qString], (err, result) => { if (err) { return console.error('error running query

这是我的代码:

  const queryFirstNames = function (qString) {
    let firstNameMatches;
    client.query('SELECT * FROM famous_people WHERE first_name = $1', [qString], (err, result) => {
      if (err) {
        return console.error('error running query', err);
      }

      firstNameMatches = result.rows;
      return firstNameMatches;
      client.end();
   });
 };

 console.log(queryFirstNames(qString));
});

但是如果我在函数内部匹配console.log firstname,而不是返回,然后在没有控制台日志记录的情况下调用函数


我想做的是返回这个查询的结果并在另一个函数中使用它,所以我不想让它控制台记录结果,但是当我尝试返回结果时,它会给我未定义的结果,并且也不会关闭数据库连接。

我相信您遇到的问题是,当您返回firstNameMatches时,您只是将其返回给client.query的回调。firstNameMatches是在queryFirstNames函数的上下文中设置的,但是您永远不会返回它。也就是说,您还利用了对client.query的异步调用。这意味着当您从queryFirstNames函数返回时,很可能您还没有完成查询。根据这一点,我很确定你想要利用承诺来管理这件事或者其他答案中的一个

除此之外,您还需要将返回移动到client.end之前。为了处理我的答案,我创建了一个您可以看到的JSFIDLE。我必须通过promise创建自己的promise,以模拟执行查询的客户机

  const queryFirstNames = function (qString) {
    let firstNameMatches;
    client.query('SELECT * FROM famous_people WHERE first_name = $1', [qString])
    .then((result) => {

      firstNameMatches = result.rows;
      client.end();
      return firstNameMatches;
    })
    .then(f => {
        console.log(f);
    })
    .catch(e => {
      if (err) {
        return console.error('error running query', err);
      }
    });
  };

我认为您遇到的问题是,当您返回firstNameMatches时,您只是将其返回给client.query的回调。firstNameMatches是在queryFirstNames函数的上下文中设置的,但是您永远不会返回它。也就是说,您还利用了对client.query的异步调用。这意味着当您从queryFirstNames函数返回时,很可能您还没有完成查询。根据这一点,我很确定你想要利用承诺来管理这件事或者其他答案中的一个

除此之外,您还需要将返回移动到client.end之前。为了处理我的答案,我创建了一个您可以看到的JSFIDLE。我必须通过promise创建自己的promise,以模拟执行查询的客户机

  const queryFirstNames = function (qString) {
    let firstNameMatches;
    client.query('SELECT * FROM famous_people WHERE first_name = $1', [qString])
    .then((result) => {

      firstNameMatches = result.rows;
      client.end();
      return firstNameMatches;
    })
    .then(f => {
        console.log(f);
    })
    .catch(e => {
      if (err) {
        return console.error('error running query', err);
      }
    });
  };

您甚至在执行client.end()之前就返回了调用;这样,您的客户端连接将永远不会结束。您可以这样做:

const query = client.query(
    'SELECT * FROM famous_people WHERE first_name = $1',
    [qString], 
    (err, result) => {
        if (err) {
            return console.error('error running query', err);
        }
    });

    query.on('row', (row) => {
      results.push(row);
    });

   // After all data is returned, close connection and return results
    query.on('end', () => {
        return res.json(results);
    });

您甚至在执行client.end()之前就返回了调用;这样,您的客户端连接将永远不会结束。您可以这样做:

const query = client.query(
    'SELECT * FROM famous_people WHERE first_name = $1',
    [qString], 
    (err, result) => {
        if (err) {
            return console.error('error running query', err);
        }
    });

    query.on('row', (row) => {
      results.push(row);
    });

   // After all data is returned, close connection and return results
    query.on('end', () => {
        return res.json(results);
    });

谢谢分享!这有助于我正确地关闭数据库连接,但当我返回结果值时,它仍然返回未定义,但当我输入console.log时,它会打印正确的数组。谢谢分享!这有助于我正确地关闭数据库连接,但当我返回结果值时,它仍然返回未定义的,但当我返回console.log时,它会打印正确的数组。这非常感谢您所说的,非常有意义。但是,firstNameMatches变量似乎在client.end()之前只有一个值-因此,当我运行代码时,它返回未定义的console.logs,但如果我从查询内部输入console.log firstNameMatches,它将输出一个值。这就好像firstNameMatches不存在于查询范围之外,尽管我在父函数中定义了它,所以我对代码进行了更多的处理,似乎当我在查询中重置firstNameMatches的值时,它不会持久存在,所以当我在查询之外返回firstNameMatches时,它将返回它最初的值,而不是我在查询中设置的值。非常感谢您的帮助-您所说的非常有意义。但是,firstNameMatches变量似乎在client.end()之前只有一个值-因此,当我运行代码时,它返回未定义的console.logs,但如果我从查询内部输入console.log firstNameMatches,它将输出一个值。这就好像firstNameMatches不存在于查询范围之外,尽管我在父函数中定义了它,所以我对代码进行了更多的处理,似乎当我在查询中重置firstNameMatches的值时,它不会持久存在,所以当我在查询之外返回firstNameMatches时,它将返回它最初的值,而不是我在查询中设置的值。