Получить результат postgres-запроса как переменную в nodejs

1

Я знаю, что следующий код печатает результат моего запроса в командной строке:

query.on("row", function (row, result) {
  result.addRow(row);
});

query.on("end", function (result, callback) {
    println(JSON.stringify(result))
});

Тем не менее, я хочу использовать значение результата в следующем коде как переменную, а не просто распечатать ее в командной строке.

Обновление. Невозможно использовать значения для следующего запроса, я хочу, чтобы он находился за пределами области запроса:

query.on("row", function (row, result) {
  result.addRow(row);
});

query.on("end", function (result, callback) {
    println(JSON.stringify(result))
});
//use the result here

Заранее благодарю за ваши ответы.

1 ответ

2
Лучший ответ

У вас есть 2 варианта:

  • Если вы хотите продолжить использование базового драйвера, вам придется использовать обратный вызов результата, а затем вложить их для использования результата в следующем запросе:

    connection.query(query1, values1, function(err1, result1) {
        // check if(err1) first, then:
        connection.query(query2, values2, function(err2, result2) {
            // check if(err2) first, then:
            connection.query(query3, values3, function(err3, result3) {
                // check if(err3) first, then:
                cb(result1, result2, result3);        
            });
        });
    });
    
  • Альтернативный подход заключается в использовании обещаний (pg-prom), когда вы можете связать такие вызовы следующим образом:

    db.query(query1, values2)
        .then(data => {
            return db.query(query2, values2);
        })
        .then(data => {
            return db.query(query3, values3);
        })
        .catch(error => {});
    

Хотя правильный подход для пг-обещание в этом случае с помощью метода task:

db.task(t => {
    const result = {};
    return t.query(query1, values1)
        .then(data => {
            result.a = data;
            return t.query(query2, values2);
        })
        .then(data => {
            result.b = data;
            return t.query(query3, values3);
        });
        .then(data => {
            result.c = data;
            return result;
        });
})
    .than(data => {
        // data = {a, b, c}
    })
    .catch(error => {});

Второй подход автоматически дает вам доступ к современному синтаксису ES6 и ES7 при одновременном выполнении нескольких запросов, как вы можете:

Для ES6:

db.task(function * (t) {
    let a = yield t.query(query1, values1);
    let b = yield t.query(query2, values2);
    let c = yield t.query(query3, values3);
    return {a, b, c};
})
    .than(data => {
        // data = {a, b, c}
    })
    .catch(error => {});

Для ES7/Babel:

db.task(async t => {
    let a = await t.query(query1, values1);
    let b = await t.query(query2, values2);
    let c = await t.query(query3, values3);
    return {a, b, c};
})
    .than(data => {
        // data = {a, b, c}
    })
    .catch(error => {});
  • 0
    Это хороший ответ на мой вопрос, но вопрос был неточным, извините за это. Я был бы признателен, если бы вы прочитали обновленный вопрос и помогли мне снова;).
  • 0
    @Sebastian Там я обновил ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню