Utilisez promesse pour traiter la valeur de retour MySQL dans node.js
J'ai un python de fond et est actuellement vers node.js. J'ai un problème de réglage de node.js en raison de sa nature asynchrone.
Par exemple, je suis en train de retourner une valeur à partir d'une base MySQL fonction.
function getLastRecord(name)
{
var connection = getMySQL_connection();
var query_str =
"SELECT name, " +
"FROM records " +
"WHERE (name = ?) " +
"LIMIT 1 ";
var query_var = [name];
var query = connection.query(query_str, query_var, function (err, rows, fields) {
//if (err) throw err;
if (err) {
//throw err;
console.log(err);
logger.info(err);
}
else {
//console.log(rows);
return rows;
}
}); //var query = connection.query(query_str, function (err, rows, fields) {
}
var rows = getLastRecord('name_record');
console.log(rows);
Après quelques lectures, je me rends compte que le code ci-dessus ne peuvent pas travailler et j'ai besoin de retourner une promesse en raison de node.js's de la nature asynchrone. Je ne peux pas écrire node.js type de code python. Comment puis-je convertir des getLastRecord()
de retour d'une promesse et comment dois-je traiter la valeur retournée?
En fait, ce que je veux faire, c'est quelque chose comme cela;
if (getLastRecord() > 20)
{
console.log("action");
}
Comment cela peut-il être fait dans node.js dans un lisible?
Je voudrais voir comment les promesses peuvent être mises en œuvre dans ce cas à l'aide de bluebird.
source d'informationauteur user781486
Vous devez vous connecter pour publier un commentaire.
Ça va être un peu dispersés, pardonnez-moi.
Tout d'abord, en supposant que ce code utilise le pilote mysql API correctement, voici une façon pour vous envelopper de travailler avec un natif promesse:
Donc une chose: Vous avez encore des rappels. Les rappels sont que des fonctions que vous avez la main pour quelque chose que l'appel à un certain moment dans l'avenir avec des arguments de son choix. Donc les arguments de la fonction dans
xs.map(fn)
le(err, result)
fonctions vues dans le nœud et la promesse de résultat et de gestionnaires d'erreurs sont tous les rappels. C'est un peu confus par des personnes se référer à un type spécifique de rappel "rappels," ceux de(err, result)
utilisé dans le nœud de base dans ce qui est appelé "la continuation passing style", parfois appelé "nodebacks" par des gens qui ne sont pas vraiment comme eux.Pour l'instant, au moins (async/await est à venir par la suite), vous êtes un peu coincé avec rappels, indépendamment de savoir si vous adoptez des promesses ou pas.
Aussi, je note que les promesses ne sont pas immédiatement, évidemment utile ici, vous avez toujours un rappel. Promet seulement vraiment briller lorsque vous les combinez avec
Promise.all
et la promesse d'accumulateurs à laArray.prototype.reduce
. Mais ils ne briller parfois, et ils sont vaut la peine d'apprendre.J'ai modifié votre code pour utiliser Q(MNP module) promesses.
J'ai Supposé que votre " getLastRecord () fonction que vous avez spécifié dans l'extrait ci-dessus fonctionne correctement.
Vous pouvez vous référer lien suivant pour obtenir de Q module
Cliquez ici : Q documentation
Je suis nouvelle Node.js et les promesses. J'étais à la recherche pendant un certain temps pour quelque chose qui va répondre à mes besoins et c'est ce que j'ai fini par utiliser après la combinaison de plusieurs exemples que j'ai trouvé. Je voulais la possibilité d'acquérir la connexion par requête et de le libérer juste après la requête se termine (
querySql
), ou pour obtenir une connexion à partir de la piscine et de l'utiliser à l'intérieur de la Promesse.à l'aide d'étendue ou de la libérer à chaque fois que je le voudrais (getSqlConnection
).En utilisant cette méthode, vous pouvez concat plusieurs requêtes l'une après l'autre sans nidification.
db.js
usage_route.js
Vous n'avez pas besoin d'utiliser des promesses, vous pouvez utiliser une fonction de rappel, quelque chose comme ça:
Pour répondre à votre question initiale: Comment cela peut-il être fait dans node.js dans un lisible?
Il y a une bibliothèque appelée
co
qui vous donne la possibilité d'écrire du code asynchrone en mode synchrone flux de travail. Juste un coup d'oeil etnpm install co
.Le problème auquel vous êtes confronté très souvent avec cette approche, c'est que vous n'obtenez pas
Promise
de toutes les bibliothèques que vous utilisez. Si vous avez enveloppez-le vous-même (voir la réponse de @Joshua Holbrook) ou recherchez un wrapper (par exemple:npm install mysql-promise
)(Btw: sur la feuille de route pour ES7 à la prise en charge native pour ce type de flux de production avec les mots-clés
async
await
mais ce n'est pas encore dans le nœud: le nœud de la liste des nouveautés.)Cela peut être réalisé très simplement, par exemple avec bluebird, comme vous avez demandé:
À l'aide du package promesse-mysql la logique serait de la chaîne promet l'aide d'alors(function(response){votre code})
et
catch(function(response){votre code}) pour détecter les erreurs de la "puis" blocs précédant le bloc catch.
Suivant cette logique, vous passerez des résultats de la requête dans des objets ou des tableaux à l'aide de retour à la fin du bloc. Le retour aidera à passer les résultats de la requête à l'autre bloc. Ensuite, le résultat sera trouvé en argument de la fonction (ici, il est test1). Selon cette logique, vous pouvez enchaîner plusieurs requêtes MySql et le code qui est nécessaire pour manipuler le résultat et de faire ce que vous voulez.
l'objet de Connexion est créée pour être mondial, car chaque objet et variable créée dans chaque bloc sont uniquement locales. N'oubliez pas que vous pouvez enchaîner plus "puis" blocs.