L'interrogation d'une base de données MySQL à partir d'un NodeJS AWS Lambda Fonction

Je vais avoir un problème de l'interrogation de ma base de données MySQL (hébergé à distance à partir d'AWS) à l'intérieur de mon AWS Lambda fonction.

C'est mon code, sauf pour les pièces dont j'ai besoin pour le reste de la fonction Lambda (qui est appelé pour une Alexa de Compétences):

  var mysql = require('mysql');
  var connection = mysql.createConnection({
        host     : '<myserver>',
        user     : '<myusername>',
        password : '<mypw>',
        database : '<mydatabase>'
  });
  connection.connect(function(err){
        if(!err) {
              console.log("Database is connected ... nn");
        }
        else {
              console.log("Error connecting database ... nn");
        }
  });

  connection.query("INSERT INTO Users (user_id) VALUES ('TESTNAME')");
  connection.end();

Cela fonctionne bien quand je le lance avec le nœud de mon invite de commande:

node index.js

Je suis en utilisant le "mysql" module installé via npm dans le répertoire avec index.js et zip et de le télécharger à ma fonction Lambda.

Encore une fois, cela fonctionne sur ma machine de développement, mais ne donne pas d'indicateur lors de l'essai de ma fonction Lambda pourquoi il n'a pas d'effet de ma base de données à tous.

Ma question s'étend sur Alexa Lambda autant qu'il fait le bon usage de la base de données mysql Node.JS le module.

Voici mon code actuel pour ma Lambda, et le problème ici, bien sûr, est toujours que mon test de valeur -> nom d'utilisateur appelé "NOMTEST" n'est pas ajouté à ma base de données MySQL.

J'ai mis de la requête dans la connexion de rappel que le premier commentaire suggère, et je vais mettre mon nouveau code au lieu de la mise à jour de mon ancien code ci-dessus, juste pour garder une trace de ce que je pense que le code de transition devrait être dans mon Alexa de la fonction Lambda:

Code mis à jour:

var mysql = require('mysql');
var connection = mysql.createConnection({
host     : '<myserver>',
user     : '<myusername>',
password : '<mypw>',
database : '<mydatabase>'
});
exports.handler = (event, context) => {
try {
if (event.session.new) {
//New Session
console.log("NEW SESSION");
}
switch (event.request.type) {
case "LaunchRequest":
//Launch Request
console.log(`LAUNCH REQUEST`);
context.succeed(
generateResponse({},
buildSpeechletResponse("Welcome to an Alexa Skill, this is running on a deployed lamda function", true)
)
);
break;
case "IntentRequest":
//Intent Request
console.log(`Intent Request`);
console.log('Then run MySQL code:');
connection.connect(function(err) {
console.log('Inside connection.connect() callback');
if (!err) {
console.log("Database is connected ... ");
connection.query("INSERT INTO Users (user_id) VALUES ('TESTNAME')",
function(err, result) {
console.log("Inside connection.query() callback")
if (!err) {
console.log("Query Successful! Ending Connectection.");
connection.end();
} else {
console.log("Query error!");
}
});
} else {
console.log("Error connecting database ..." + err.message);
}
});
context.succeed(
generateResponse({},
buildSpeechletResponse("Welcome to the incredible intelligent MySQLable Alexa!", true)
)
);
break;
case "SessionEndedRequest":
//Session Ended Request
console.log(`SESSION ENDED REQUEST`);
break;
default:
context.fail(`INVALID REQUEST TYPE: ${event.request.type}`);
}
} catch (error) {
context.fail(`Exceptiodn: ${error}`)
}
};
//Helpers
buildSpeechletResponse = (outputText, shouldEndSession) => {
return {
outputSpeech: {
type: "PlainText",
text: outputText
},
shouldEndSession: shouldEndSession
};
};
generateResponse = (sessionAttributes, speechletResponse) => {
return {
version: "1.0",
sessionAttributes: sessionAttributes,
response: speechletResponse
};
};

Et ma sortie de la console:

START RequestId: 5d4d17a7-0272-11e7-951c-b3d6944457e1 Version: $LATEST
2017-03-06T13:39:47.561Z    5d4d17a7-0272-11e7-951c-b3d6944457e1    Intent Request
2017-03-06T13:39:47.562Z    5d4d17a7-0272-11e7-951c-b3d6944457e1    Then run MySQL code:
END RequestId: 5d4d17a7-0272-11e7-951c-b3d6944457e1
REPORT RequestId: 5d4d17a7-0272-11e7-951c-b3d6944457e1  Duration: 82.48 ms  Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 14 MB  
  • Vous devriez être en cours d'exécution de la requête à l'intérieur de la connexion de rappel. Ici, vous êtes le traitement de connect() comme s'il s'agissait d'une certaine manière synchrone, ce qui n'est pas, de sorte que vous peut ou peut ne pas être encore connecté lorsque vous exécutez query() Ce qui fonctionne pour vous localement par accident. Vous êtes également en ignorant toute erreur query() pourrait privide.
  • Dois-je également mettre fin à la connexion à l'intérieur du rappel?
  • J'ai mis à jour ma question plus d'informations concernant la pleine mesure de ma question et ajouté ce que je pense que vous vouliez dire par mettre ma requête dans mon connecter de rappel. Je vais prendre soin de mon erreur de manipulation de mes fonctions dès que je peux le faire pour le post de ma base de données MySQL, car autant que je sais que je ne suis pas sortie de la console lors de l'essai d'une fonction lambda, donc il faudrait être légèrement inutile à ce stade.
  • Eh bien, vous êtes incorrect sur la console. Lambda sortie de la console est connecté à CloudWatch Logs, donc il est tout à fait utile. La déconnexion doit être dans l' (actuellement absent) rappel de query().
  • Vous avez raison, chouette! Ok, j'ai mis à jour mon lambda code dans ma question. Il n'est pas à l'intérieur de mon connecter de rappel pour une raison...
InformationsquelleAutor Paul McElroy | 2017-03-04