Возврат результата запроса node-postgres - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь вернуть результат запроса node-postgres и сохранить его в переменной. Я могу прекрасно управлять console.log, но не могу найти способ вернуть результат, чтобы он был доступен за пределами метода запроса. Я в растерянности и знаю, что, должно быть, упускаю что-то очевидное (или несколько очевидных вещей), потому что, если это невозможно сделать, я не понимаю смысла node-postgres, поскольку все, что я когда-либо смогучтобы сделать, это записать мои результаты на консоль.

Я попробовал код ниже, вместе с версией, использующей обещания, и оба получают тот же результат, "неопределенный". Console.log внутри else работает нормально, но возврат не делает результат доступным для остальной части функции. В приведенном ниже коде мой возврат возвращается как «неопределенный», как на его месте будет console.log.

var selectFrom = function(data, table, condition) {
    var queryResult;
    pool.query(`SELECT ${data} FROM ${table} ${condition}`, function(err, result) {
        if(err) { console.log(err); }
        else { queryResult = result.rows[0][data]; }
    })
    pool.end();
    return queryResult;
}

var result = selectFrom('amount','total_nonfarm_monthly_sa', `WHERE month='2019-08-31'`);
console.log(result);

Ответы [ 2 ]

0 голосов
/ 06 октября 2019

Вам необходимо использовать обратные вызовы:

var selectFrom = function(data, table, condition, callback) {

    pool.query(`SELECT ${data} FROM ${table} ${condition}`, function(err, result) {
        if(err)
            return callback(err);
        callback(null, result.rows[0][data]);
    })
    pool.end();
}

selectFrom('amount','total_nonfarm_monthly_sa', `WHERE month='2019-08-31'`, function(err, result){
    console.log(err, result);   
});

или обещания:

var selectFrom = function(data, table, condition) {
    return new Promise(function(resolve, reject){
        pool.query(`SELECT ${data} FROM ${table} ${condition}`, function(err, result) {
            if(err)
                return reject(err);
            resolve(result.rows[0][data]);
        })
        pool.end();
    });
}

selectFrom('amount','total_nonfarm_monthly_sa', `WHERE month='2019-08-31'`)
.then(function(result){
    console.log(result);    
}).catch(function(err){
    console.log(err);   
});
0 голосов
/ 06 октября 2019

Метод query - это асинхронный вызов, вы должны использовать async / await или Promise.

С async / await:

await client.connect()
const res = await client.query("SELECT amount FROM total_nonfarm_monthly_sa WHERE month='2019-08-31'");
console.log(res.rows[0]);
await client.end();

Редактировать:Я вижу, что есть опция обратного вызова, но я бы использовал async / await

...