J'essaye de connecter hapi.js avec mysql. Mais lors de la définition d'un server.route. le handler
ne renvoie pas de valeur.
server.route({ method:'GET', path:'/hello', handler:function(request,h) { connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) { if (error) throw error; console.log('The solution is: ', results[0].solution); return ('The solution is: ', results[0].solution) }); } });
Il dit Error: la méthode du handler n'a pas renvoyé une valeur, une promesse ou une erreur .
Ici, je renvoie ('La solution est:', résultats [0] .solution)
Mais cela ne fonctionne toujours pas.
Le résultat dans la console est La solution est: 2
mais dans le navigateur, c'est une erreur.
Veuillez aider. Merci
3 Réponses :
Essayez d'utiliser async / await
server.route({ method: 'GET', path: '/hello', handler: async function (request, h) { try { const { credentials, artifacts } = await request.server.auth.test('default', request); return { status: true, user: credentials.name }; } catch (err) { return { status: false }; } } });
il renvoie "status": false
J'ai résolu ce problème en convertissant mon rappel en promesse.
handler: (request, h) => { return new Promise ((resolve, reject)=> { connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) { if (error) throw error; console.log('The solution is: ', results[0].solution); let solution = 'The solution is: ' + results[0].solution let view = () => { return h.view('landing-page', {solution: solution}); } return resolve(view()) }); }) }
Mon problème n'est pas spécifique à hapi ou mysql, mais plutôt à mes compétences en javascript.
Depuis Hapi v17, tous les gestionnaires de route doivent renvoyer explicitement quelque chose.
Comme vous pouvez le voir dans votre erreur, vous ne renvoyez aucune valeur car vous renvoyez quelque chose dans un rappel d'une fonction asynchrone qui n'est pas dans le main fonction de gestionnaire.
Vous avez plusieurs options pour gérer cela, la première est de convertir votre gestionnaire de route en async
et d'utiliser await
pour les fonctions asynchrones comme ceci:
const { promisify } = require('util'); [...] handler: function (request, h) { const query = promisify(connection.query); return query('SELECT fancy SQL') .then(result => { // do something with sql result return result }) }
Remarque : cela ne fonctionne que si votre connection.query
renvoie une promesse au lieu d'un rappel NodeJS style. Si ce n'est pas le cas, vous pouvez consulter utils.promisify pour convertir une fonction avec un rappel en Promise ou manuellement en enveloppant votre fonction dans une nouvelle Promise
vous-même.
Cependant si vous ne voulez pas ou ne pouvez pas utiliser await / async, vous pouvez toujours convertir la fonction avec un rappel en promesse, puis renvoyer la promesse, mais cela peut entraîner de nombreux chaînages.
handler: async function (request, h) => { const result = await connection.query('SELECT 1 + 1 AS solution') return result // do something with sql result then return it; }
La valeur de retour de votre itinéraire sera la dernière valeur de retour du dernier , puis
.
Dans votre gestionnaire async / await, vous faites la même chose (c'est-à-dire que vous ne renvoyez rien). Vous obtiendrez la même Erreur: la méthode du gestionnaire n'a pas renvoyé une valeur, une promesse ou généré une erreur
.
@GoalBased tu es absolument j'ai édité ma réponse pour correspondre à ton commentaire, merci
Le retour de rappel ne peut pas être considéré comme le retour de la fonction principale.
connaissez-vous une solution de contournement avec cela? J'ai essayé de créer une variable dans la fonction principale
var solution = "text"
puis dans le callback, jereturn solution = 'La solution est:' + results [0] .solution code >. Mais ça ne marche toujours pas
avez-vous vérifié ma réponse? savez-vous comment utiliser Promises?
J'ai vérifié votre réponse. Je ne sais pas comment utiliser les promesses. Désolé. Je vais chercher comment l'utiliser. Merci pour votre réponse