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écutezquery()
Ce qui fonctionne pour vous localement par accident. Vous êtes également en ignorant toute erreurquery()
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...
Vous devez vous connecter pour publier un commentaire.
Le problème était que je devais mettre mon contexte.réussir à l'intérieur de mes rappels. Un grand merci à sqlbot, comme son discours de rappels m'a conduit à l'étude où les choses étaient réellement mettre fin à leur exécution.
Donc, apparemment, lors de l'utilisation d'AWS Lambda, si le "contexte" se termine avant vos rappels appelés, vous ne recevez pas vos rappels. Donc, même si j'avais placé tous mes rappels comme suit: connectez -> query -> fin, le premier rappel de la chaîne de connecter n'est jamais appelé parce que "le contexte.réussir" a été appelé juste après, qui s'est terminée l'exécution.
Voici mon code dès maintenant (obtention d'une bonne requête passe maintenant):