带有 PG-Promise 的 AWS Lambda NodeJS - 从模块调用函数时得到空查询结果

AWS Lambda NodeJS with PG-Promise - get empty query result when calling a function from a module

这对你们大多数人来说可能很简单,但我为此苦苦挣扎了几个小时。我有一个 aws lambda 函数,它使用 pg-promise 针对 RDS pgsql 数据库执行多个 pgsql 查询。为了组织代码,我想把一些功能分成模块。

我可以在主文件中执行并获得结果,但是当我尝试在另一个文件中并将其导出为模块时。我只得到一个空对象。

文件(已截断)

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,实际结果:"message":{}

helpers.js

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

module.exports = {

    tagexist : function (tags, uid) {
        db.oneOrNone('SELECT id FROM table_tags WHERE tag =  and uid = ', [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;

你的 helper.js 应该是这样的,基本上你需要 return 承诺。


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

module.exports = {

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

index.js 应该是这样的。基本上你需要等待承诺来解决。由于您已经在使用 promises,因此您可以使用 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};
};