带有 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};
};
这对你们大多数人来说可能很简单,但我为此苦苦挣扎了几个小时。我有一个 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};
};