![](/img/trans.png)
[英]Master user can't connect to an existing database in Aurora MySQL - RDS
[英]Node Lambda Function can't query an AWS Aurora MySQL database
我正在尝试使用 Lambda Function 写入 aws aurora mysql 数据库。
由于某种原因,它似乎不起作用。 到目前为止,我的代码非常简单但无法正确执行。 这是一个简单的 lambda function,当用户注册 cognito 时调用它,并且应该只在 SQL 数据库中使用用户凭据创建一个新条目。
const mysql = require('mysql')
const db = mysql.createConnection({
host: "*****",
port: *****,
user: "*****",
password: "*****",
database: "*****",
})
export const lambdaHandler = async (event: any, context: any,) => {
const user = {
uid: event.request.userAttributes.sub,
username: event.request.userAttributes.nickname,
email: event.request.userAttributes.email,
}
console.log("before query")
const query = `INSERT INTO users (Uid, Username, Email) VALUES (${user.uid}, ${user.username}, ${user.email})`
await db.query(query, (err: any, result: any) => {
if (err) console.error(err)
console.log("query response: " + result)
})
console.log("after query")
return event;
};
function的output如下:
START RequestId: bb1d2143-97e4-4761-a48a-f482cf94f73b Version: $LATEST
2022-03-17T14:02:35.956Z bb1d2143-97e4-4761-a48a-f482cf94f73b INFO before query
2022-03-17T14:02:35.961Z bb1d2143-97e4-4761-a48a-f482cf94f73b INFO after query
END RequestId: bb1d2143-97e4-4761-a48a-f482cf94f73b
REPORT RequestId: bb1d2143-97e4-4761-a48a-f482cf94f73b Init Duration: 0.14 ms Duration: 138.07 ms Billed Duration: 139 ms Memory Size: 128 MB Max Memory Used: 128 MB
注意:查询function没有找到日志。(应该抛出错误或日志响应)
lambda function 的执行角色中的策略是: AWSLambdaVPCAccessExecutionRole
和AWSLambda_FullAccess
Lambda function和Aurora在同一个vpc的不同su.net中。 我不确定这是否会导致问题。 但这不会导致 function 抛出错误吗? missing authorization
之类的东西?
我不明白我现在还缺少什么
问题是db.query
使用回调风格而不是承诺风格。 您必须将其转换为使用承诺。
一种方法是使用Util.promisify
...
const util = require('util');
const mysql = require('mysql');
const db = mysql.createConnection({
host: "*****",
port: *****,
user: "*****",
password: "*****",
database: "*****",
});
// Convert db.query into a function that returns a promise
const promisifiedQuery = util.promisify(db.query);
export const lambdaHandler = async (event: any, context: any,) => {
const user = {
uid: event.request.userAttributes.sub,
username: event.request.userAttributes.nickname,
email: event.request.userAttributes.email,
};
console.log("before query");
// BTW, this is bad. Read about how to avoid SQL injections.
const query = `INSERT INTO users (Uid, Username, Email) VALUES (${user.uid}, ${user.username}, ${user.email})`;
await promisifiedQuery(query).then(result => {
console.log("query response: " + result)
console.log("after query")
}).catch(console.error)
return event;
};
您必须在执行查询之前调用db.connect()
,在执行查询之后调用db.end()
。 参见https://www.npmjs.com/package/mysql#introduction 。 我怀疑如果你不这样做,它只会忽略await db.query
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.