Die AWS Aurora MySQL-Datenbank kann nicht von der Node-Lambda-Funktion abgefragt werden
P粉184747536
P粉184747536 2023-08-25 21:31:48
0
1
700
<p>Ich versuche, eine Lambda-Funktion zu verwenden, um Daten in eine AWS Aurora MySQL-Datenbank zu schreiben. </p> <h3>code</h3> <p>Aus irgendeinem Grund scheint es nicht zu funktionieren. Mein Code ist bisher sehr einfach, wird aber nicht korrekt ausgeführt. Dies ist eine einfache Lambda-Funktion, die aufgerufen wird, wenn sich ein Benutzer bei Cognito registriert und einen neuen Eintrag in der SQL-Datenbank erstellen soll, der die Anmeldeinformationen des Benutzers enthält. </p> <pre class="brush:php;toolbar:false;">const mysql = require('mysql') const db = mysql.createConnection({ Gastgeber: "****", Hafen: *****, Benutzer: "*****", Passwort: "*****", Datenbank: „*****“, }) export const lambdaHandler = async (event: any, context: any,) => const user = { uid: event.request.userAttributes.sub, Benutzername: event.request.userAttributes.nickname, E-Mail: event.request.userAttributes.email, } console.log("vor der Abfrage") const query = `INSERT INTO users (Uid, Username, Email) VALUES (${user.uid}, ${user.username}, ${user.email})` wait db.query(query, (err: any, result: any) => { if (err) console.error(err) console.log("Abfrageantwort: " + Ergebnis) }) console.log("nach Abfrage") Rückkehrereignis; };</pre> <p>Die Ausgabe der Funktion ist wie folgt: </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 vor der Abfrage 2022-03-17T14:02:35.961Z bb1d2143-97e4-4761-a48a-f482cf94f73b INFO nach Abfrage END RequestId: bb1d2143-97e4-4761-a48a-f482cf94f73b REPORT RequestId: bb1d2143-97e4-4761-a48a-f482cf94f73b Initialisierungsdauer: 0,14 ms Dauer: 138,07 ms Abgerechnete Dauer: 139 ms Speichergröße: 128 MB Max. genutzter Speicher: 128 MB</pre> <p>Hinweis: Die Abfragefunktion hat den Protokolldatensatz nicht gefunden (sollte einen Fehler auslösen oder die Antwort protokollieren)</p> <h3>Strategie</h3> <p>Die folgenden Richtlinien sind in der Ausführungsrolle der Lambda-Funktion enthalten: <code>AWSLambdaVPCAccessExecutionRole</code> und <code>AWSLambda_FullAccess</code></p> <h3>Andere</h3> <p>Die Lambda-Funktion und Aurora befinden sich in verschiedenen Subnetzen derselben VPC. Ich bin mir nicht sicher, ob dies ein Problem verursachen wird. Aber würde dies nicht dazu führen, dass die Funktion einen Fehler auslöst? Fehler ähnlich wie <code>fehlende Autorisierung</code>? </p> <p>Ich verstehe nicht, was ich an dieser Stelle übersehe</p>
P粉184747536
P粉184747536

Antworte allen(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;
};
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage