对于大多数人来说,这可能很简单,但是我已经为此苦苦挣扎了好几个小时。我有一个aws lambda函数,该函数对RDS pgsql数据库执行多个带有pg-promise的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});
};
预期的行为:“消息”:id,实际结果:“消息”:{}
helpers.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;
您的helper.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
应该看起来像这样。基本上,您需要谨慎应对诺言。由于您已经在使用Promise,因此可以通过使用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};
};