【问题标题】:Problem with aws Lambda function and postgres DBaws Lambda 函数和 postgres DB 的问题
【发布时间】:2019-08-21 18:53:45
【问题描述】:

在这一天,我遇到了 aws lambda 的问题。我需要通过将用户名传递给 lambda 来搜索 RDS postgres db,但在每个测试事件中它都会返回:

"{
  "errorMessage": "RequestId: 070f76a4-41c6-40d1-8ef2-0a84d9c04af0 Process exited before completing request"
}"

特别是堆栈返回:

START RequestId:070f76a4-41c6-40d1-8ef2-0a84d9c04af0 版本:$LATEST 2019-03-31T12:32:19.572Z 070f76a4-41c6-40d1-8ef2-0a84d9c04af0 类型错误: 路径必须是字符串。收到未定义 在 assertPath (path.js:28:11) 在 Object.join (path.js:1236:7) 在 Object.module.exports.getFileName (/var/task/node_modules/pgpass/lib/helper.js:61:16) 在 module.exports (/var/task/node_modules/pgpass/lib/index.js:10:23) 在连接处。 (/var/task/node_modules/pg/lib/client.js:110:9) 在 emitOne (events.js:116:13) 在 Connection.emit (events.js:211:7) 在套接字。 (/var/task/node_modules/pg/lib/connection.js:125:12) 在 emitOne (events.js:116:13) 在 Socket.emit (events.js:211:7) END RequestId: 070f76a4-41c6-40d1-8ef2-0a84d9c04af0 REPORT RequestId: 070f76a4-41c6-40d1-8ef2-0a84d9c04af0 持续时间:583.72 毫秒 持续时间:600 毫秒内存大小:128 MB 使用的最大内存:35 MB
RequestId: 070f76a4-41c6-40d1-8ef2-0a84d9c04af0 进程之前退出 完成请求

const AWS = require('aws-sdk');

global.fetch = require('node-fetch');

var Pool = require('pg').Pool;

const psql = new Pool ({

host: '',
user: '',
password: '',
database: 'metadata',
port: 5432
})

function searchUser(username){

return new Promise((resolve, reject) => {

    psql.query("SELECT username FROM utilitator where username LIKE '%$1%'", [username], {

        onSucces: function(res){
            resolve(res.rows);
        },
        onFailure: function(err){
            resolve("err");
        },
    });
});
}

exports.handler = async (event, context, callback) => {
//var body = JSON.parse(event.body);

var username = event.username;

var response = {
    "statusCode": 200,
    "isBase64Encoded": false,
    "body": {},
}

try{
    var result = await searchUser(username).then((result) => {
        return result;
    });

    var statusCode = 200;
    var body = result;
    if(result == "err"){
        statusCode = 400;
        body = "user not found";
    }

    response.statusCode = statusCode;
    response.body = body;

    callback(null,response);
}
catch(e){
    callback(e,{
        "isBase64Encoded": false,
        "headers": {},
        "body": "err",
        "statusCode": 501
    });
}
};

我希望 Lambda 返回 db 中所有与我传递的用户名相似的用户。

【问题讨论】:

    标签: node.js postgresql amazon-web-services aws-lambda


    【解决方案1】:

    我浏览了node-postgres docs,但没有找到对onSuccessonFailure 事件的任何引用,但只有errres 回调中的对象(但我可能忽略了它):

    client.query(text, values, (err, res) => {
      if (err) {
        console.log(err.stack)
      } else {
        console.log(res.rows[0])
        // { name: 'brianc', email: 'brian.m.carlson@gmail.com' }
      }
    })
    

    不过,它也支持 Promise 版本,这意味着您不必自己承诺:

    try {
      const res = await pool.query(text, values)
      console.log(res.rows[0])
      // { name: 'brianc', email: 'brian.m.carlson@gmail.com' }
    } catch(err) {
      console.log(err.stack)
    }
    

    这意味着您的 searchUser 函数应该如下所示:

    const searchUser = username => {
      return await psql.query('SELECT username FROM utilitator where username LIKE $1', [`%${username}%`])
    };
    

    最后,在您的处理程序上,由于您已经在使用 Node 8,因此您不应该将 Promise 和回调混在一起。只需在响应对象中以字符串化 JSON 形式返回正文,如下所示(为简单起见,省略了错误处理):

    exports.handler = async (event) => {
      //const body = JSON.parse(event.body);
    
      const username = event.username;
    
      const result = await searchUser(username)
    
      if (result == "err") {
        return {
          "statusCode": 404,
          "isBase64Encoded": false,
          "body": JSON.stringify({message: 'User not found'}),
        }
      }
      return {
        "statusCode": 200,
        "isBase64Encoded": false,
        "body": JSON.stringify(result),
      }
    
    };
    

    【讨论】:

    • 好吧,我试过了,但没有接受 searchUser 中的 await,但没有它可以工作。唯一的问题是体内是空的
    • 好吧,这显然是另一个问题了。你不会再有例外了。如果正文为空,则很可能是您的查询中有错误或表为空。
    • 您的查询中有错误。我已经相应地编辑了我的答案。为方便起见,以下是调用查询的方法return await psql.query('SELECT username FROM utilitator where username LIKE $1', [`%${username}%`])
    猜你喜欢
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    相关资源
    最近更新 更多