gpt4 book ai didi

node.js - aws Lambda 函数和 postgres DB 的问题

转载 作者:行者123 更新时间:2023-11-29 13:40:59 25 4
gpt4 key购买 nike

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

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

特别是这是堆栈返回:

START RequestId: 070f76a4-41c6-40d1-8ef2-0a84d9c04af0 Version: $LATEST 2019-03-31T12:32:19.572Z 070f76a4-41c6-40d1-8ef2-0a84d9c04af0 TypeError: Path must be a string. Received undefined at assertPath (path.js:28:11) at Object.join (path.js:1236:7) at Object.module.exports.getFileName (/var/task/node_modules/pgpass/lib/helper.js:61:16) at module.exports (/var/task/node_modules/pgpass/lib/index.js:10:23) at Connection. (/var/task/node_modules/pg/lib/client.js:110:9) at emitOne (events.js:116:13) at Connection.emit (events.js:211:7) at Socket. (/var/task/node_modules/pg/lib/connection.js:125:12) at emitOne (events.js:116:13) at Socket.emit (events.js:211:7) END RequestId: 070f76a4-41c6-40d1-8ef2-0a84d9c04af0 REPORT RequestId: 070f76a4-41c6-40d1-8ef2-0a84d9c04af0 Duration: 583.72 ms Billed Duration: 600 ms Memory Size: 128 MB Max Memory Used: 35 MB
RequestId: 070f76a4-41c6-40d1-8ef2-0a84d9c04af0 Process exited before completing request

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 返回数据库中所有与我传递的用户名相似的用户。

最佳答案

我正在浏览 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 版本,这意味着您不必自己对其进行 promifisy:

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),
}

};

关于node.js - aws Lambda 函数和 postgres DB 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55441023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com