La base de données AWS Aurora MySQL ne peut pas être interrogée par la fonction Node Lambda
P粉184747536
P粉184747536 2023-08-25 21:31:48
0
1
696
<p>J'essaie d'utiliser une fonction Lambda pour écrire des données dans une base de données AWS Aurora MySQL. </p> <h3>code</h3> <p>Pour une raison quelconque, cela ne semble pas fonctionner. Jusqu'à présent, mon code est très simple mais il ne s'exécute pas correctement. Il s'agit d'une simple fonction Lambda qui est appelée lorsqu'un utilisateur s'inscrit sur Cognito et doit créer une nouvelle entrée dans la base de données SQL contenant les informations d'identification de l'utilisateur. </p> <pre class="brush:php;toolbar:false;">const mysql = require('mysql') const db = mysql.createConnection({ hôte: "****", port: *****, utilisateur: "*****", mot de passe: "*****", base de données: "*****", }) export const lambdaHandler = async (événement : n'importe quel, contexte : n'importe lequel,) => utilisateur const = { ID utilisateur : event.request.userAttributes.sub, nom d'utilisateur : event.request.userAttributes.nickname, email : event.request.userAttributes.email, } console.log("avant requête") const query = `INSERT INTO users (Uid, Username, Email) VALUES (${user.uid}, ${user.username}, ${user.email})` wait db.query(query, (err : any, result : any) => { si (erreur) console.erreur (erreur) console.log("réponse à la requête : " + résultat) }) console.log("après requête") événement de retour ; };</pré> <p>Le résultat de la fonction est le suivant : </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 avant requête 2022-03-17T14:02:35.961Z bb1d2143-97e4-4761-a48a-f482cf94f73b INFO après requête FIN RequestId : bb1d2143-97e4-4761-a48a-f482cf94f73b REPORT RequestId : bb1d2143-97e4-4761-a48a-f482cf94f73b Durée d'initialisation : 0,14 ms Durée : 138,07 ms Durée facturée : 139 ms Taille de la mémoire : 128 Mo Mémoire maximale utilisée : 128 Mo</pre> <p>Remarque : La fonction de requête n'a pas trouvé l'enregistrement du journal (elle devrait générer une erreur ou enregistrer la réponse)</p> <h3>Stratégie</h3> <p>Les stratégies suivantes sont incluses dans le rôle d'exécution de la fonction Lambda : <code>AWSLambdaVPCAccessExecutionRole</code> et <code>AWSLambda_FullAccess</code></p> <h3>Autres</h3> <p>La fonction Lambda et Aurora se trouvent dans des sous-réseaux différents du même VPC. Je ne sais pas si cela posera un problème. Mais cela ne provoquerait-il pas une erreur de la fonction ? Erreur similaire à <code>autorisation manquante</code> ? </p> <p>Je ne comprends pas ce qui me manque à ce stade</p>
P粉184747536
P粉184747536

répondre à tous(1)
P粉960525583

Le problème est db.queryl'utilisation du style de rappel au lieu du style de promesse. Vous devez le convertir pour utiliser les promesses.

Une façon est d'utiliser 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;
};
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal