AWS Lambda NodeJS с PG-Promise - получить пустой результат запроса при вызове функции из модуля - PullRequest
0 голосов
/ 24 февраля 2020

Это может быть просто для большинства из вас, но я боролся с этим часами. У меня есть aws лямбда-функция, которая выполняет несколько запросов pg sql с pg-обещанием к базе данных RDS pg sql. Чтобы организовать код, я хочу разделить некоторые функции на модули.

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

Файлы (усеченные)

index. js

exports.handler = function (event, context, callback) {
    context.callbackWaitsForEmptyEventLoop = false;

    const db = require('./dbconfig');

    const helpers = require('./helpers');

    var userid = 1; // testing purpose

    var tagexist = helpers.tagexist

    var istagexist = tagexist(tags, userid);

    callback(null, {"message" : istagexist});
};

Ожидаемое поведение: "message": id, фактический результат: " сообщение ": {}

помощников. js

const db = require('./dbconfig');

module.exports = {

    tagexist : function (tags, uid) {
        db.oneOrNone('SELECT id FROM table_tags WHERE tag = $1 and uid = $2', [tags, uid])
        .then((id) => {
            return id;
        })
        .catch((err) => {return err;})
        .then(() => {db.$pool.end()});
    }
};

dbconf. js

const pgp = require('pg-promise')();
const dbconfig = {
    user: 'sandbox',
    host: 'host',
    database: 'sandbox',
    password: 'pass',
    port: 5432,  
}
const db = pgp(dbconfig);

module.exports = db;

1 Ответ

1 голос
/ 24 февраля 2020

Ваш помощник. js должен выглядеть следующим образом, в основном вам нужно вернуть обещание.


const db = require('./dbconfig');

module.exports = {

    tagexist : function (tags, uid) {
        return db.oneOrNone('SELECT id FROM table_tags WHERE tag = $1 and uid = $2', [tags, uid])
        .then((id) => {
            return id;
        })
        .catch((err) => {return err;})
        .then(() => {db.$pool.end()});
    }
};

index.js должно выглядеть следующим образом. по сути, вам нужно сделать ставку на обещание решить. Поскольку вы уже используете обещания, вы можете упростить код с помощью asyn / await и не использовать обратный вызов.

exports.handler = async function (event) {

    const db = require('./dbconfig');

    const helpers = require('./helpers');

    var userid = 1; // testing purpose

    var tagexist = helpers.tagexist

    var istagexist = await tagexist(tags, userid);

    return {"message" : istagexist};
};

...