AWS Aurora MySQL資料庫無法被Node Lambda函數查詢
P粉184747536
P粉184747536 2023-08-25 21:31:48
0
1
699
<p>我正在嘗試使用Lambda函數向AWS Aurora MySQL資料庫寫入資料。 </p> <h3>代碼</h3> <p>出於某種原因,它似乎無法正常工作。到目前為止,我的程式碼非常簡單,但無法正確執行。這是一個簡單的Lambda函數,當使用者註冊到Cognito時調用,應該在SQL資料庫中建立一個新條目,包含使用者憑證。 </p> <pre class="brush:php;toolbar:false;">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; };</pre> <p>函數的輸出如下:</p> <pre class="brush:php;toolbar:false;">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: 138.07 ms Billed Duration: 139 ms Memory Size: 128 MB Memory Usgt; <p>注意:查詢函數沒有找到日誌記錄(應該拋出錯誤或記錄回應)</p> <h3>策略</h3> <p>Lambda函數的執行角色包含以下策略:<code>AWSLambdaVPCAccessExecutionRole</code>和<code>AWSLambda_FullAccess</code></p> <h3>其他</h3> <p>Lambda函數和Aurora位於同一VPC的不同子網路。我不確定這是否會導致問題。但這不會導致函數拋出錯誤嗎?類似<code>missing authorization</code>的錯誤? </p> <p>我不明白我在這一點上還缺少什麼</p>
P粉184747536
P粉184747536

全部回覆(1)
P粉960525583

問題在於db.query使用回呼樣式而不是promise樣式。你需要將其轉換為使用promises。

一種方法是使用Util.promisify...

const util = require('util');
const mysql = require('mysql');

const db = mysql.createConnection({
    host: "*****",
    port: *****,
    user: "*****",
    password: "*****",
    database: "*****",
});

// 将db.query转换为返回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");

    // 顺便说一下,这样做是不好的。请阅读有关如何避免SQL注入的内容。
    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;
};
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板