0

这是我的代码:

  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 firstNameMatches 而不是返回,然后只调用函数而不进行控制台日志记录,我会得到我想要的结果,并且数据库连接会正确关闭。

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

4

2 回答 2

2

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

除此之外,您还需要将退货移至 client.end 之前。为了解决我的问题,我创建了一个 jsfiddle,您可以在此处看到。我必须通过 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);
      }
    });
  };
于 2017-02-25T06:32:20.497 回答
0

您甚至在执行 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);
    });
于 2017-02-25T06:35:33.520 回答