Pangkalan data MySQL AWS Aurora tidak boleh ditanya oleh fungsi Node Lambda
P粉184747536
P粉184747536 2023-08-25 21:31:48
0
1
698
<p>Saya cuba menggunakan fungsi Lambda untuk menulis data ke pangkalan data MySQL AWS Aurora. </p> <h3>kod</h3> <p>Atas sebab tertentu ia nampaknya tidak berfungsi. Kod saya setakat ini sangat mudah tetapi ia tidak dilaksanakan dengan betul. Ini ialah fungsi Lambda ringkas yang dipanggil apabila pengguna mendaftar ke Cognito dan harus membuat entri baharu dalam pangkalan data SQL yang mengandungi bukti kelayakan pengguna. </p> <pre class="brush:php;toolbar:false;">const mysql = require('mysql') const db = mysql.createConnection({ hos: "****", pelabuhan: *****, pengguna: "*****", kata laluan: "*****", pangkalan data: "*****", }) eksport const lambdaHandler = async (acara: mana-mana, konteks: mana-mana,) => pengguna const = { uid: event.request.userAttributes.sub, nama pengguna: event.request.userAttributes.nickname, e-mel: event.request.userAttributes.email, } console.log("sebelum pertanyaan") const query = `MASUKKAN KE DALAM pengguna (Uid, Nama Pengguna, E-mel) NILAI (${user.uid}, ${user.nama}, ${user.email})` tunggu db.query(query, (err: any, result: any) => { jika (err) console.error(err) console.log("tindak balas pertanyaan: " + hasil) }) console.log("selepas pertanyaan") acara pulang; };</pre> <p>Output fungsi adalah seperti berikut: </p> <pre class="brush:php;toolbar:false;">START RequestId: bb1d2143-97e4-4761-a48a-f482cf94f73b Versi: $LATEST 2022-03-17T14:02:35.956Z bb1d2143-97e4-4761-a48a-f482cf94f73b INFO sebelum pertanyaan 2022-03-17T14:02:35.961Z bb1d2143-97e4-4761-a48a-f482cf94f73b INFO selepas pertanyaan Id Permintaan TAMAT: bb1d2143-97e4-4761-a48a-f482cf94f73b REPORT RequestId: bb1d2143-97e4-4761-a48a-f482cf94f73b Init Tempoh: 0.14 ms Tempoh: 138.07 ms Dibilkan Tempoh: 139 ms Saiz Memori: 128 MB Maks Memori Digunakan: 128 MB</pre <p>Nota: Fungsi pertanyaan tidak menemui rekod log (harus membuang ralat atau log respons)</p> <h3>Strategi</h3> <p>Dasar berikut disertakan dalam peranan pelaksanaan fungsi Lambda: <code>AWSLambdaVPCAccessExecutionRole</code> dan <code>AWSLambda_FullAccess</code></p> <h3>Lain-lain</h3> <p>Fungsi Lambda dan Aurora berada dalam subnet berbeza bagi VPC yang sama. Saya tidak pasti sama ada ini akan menyebabkan masalah. Tetapi bukankah ini akan menyebabkan fungsi membuang ralat? Ralat serupa dengan <kod>kebenaran hilang</kod>? </p> <p>Saya tidak faham apa yang saya hilang pada ketika ini</p>
P粉184747536
P粉184747536

membalas semua(1)
P粉960525583

Masalahnya ialah db.querymenggunakan gaya panggil balik dan bukannya gaya janji. Anda perlu menukarnya untuk menggunakan janji.

Salah satu cara ialah menggunakan 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;
};
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan