繁体   English   中英

节点 Lambda Function 无法查询 AWS Aurora MySQL 数据库

[英]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 的执行角色中的策略是: AWSLambdaVPCAccessExecutionRoleAWSLambda_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM