Почему при использовании pg я возвращаю результат моего запроса из функции, он возвращает undefined, но если я консоль регистрирую его, он печатает?

Это мой код:

  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));
});

Этот код возвращает undefined и не завершает соединение с базой данных.

Но если я возвращаю console.log firstNameMatches внутри функции вместо возврата, а затем просто вызываю функцию без ведения журнала консоли, я получаю нужный результат, и соединение с базой данных закрывается должным образом.

То, что я хочу сделать, это вернуть результат этого запроса и использовать его в другой функции, поэтому я не хочу, чтобы он регистрировал результаты в консоли, но когда я пытаюсь вернуть результат, он дает мне неопределенное значение и не дает закройте соединение с базой данных либо.

2 ответа

Решение

Я полагаю, что проблема, с которой вы столкнулись, заключается в том, что когда вы возвращаете firstNameMatches, вы возвращаете его только в функцию обратного вызова для client.query. firstNameMatches устанавливается внутри контекста функции queryFirstNames, однако вы никогда не вернете это обратно. При этом вы также используете асинхронный вызов client.query. Это означает, что когда вы возвращаетесь из функции queryFirstNames, скорее всего, вы еще не завершили запрос. Поэтому я вполне уверен, что вы хотите использовать обещания для управления этим или событиями, как один из других ответов.

В дополнение к этому, вы захотите перенести возврат в файл client.end. Чтобы поиграть с моим ответом, я создал jsfiddle, который вы можете увидеть здесь. Я должен был создать собственное обещание через 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);
    });
Другие вопросы по тегам