2
votes

La méthode du gestionnaire Hapi ne renvoie pas de valeur

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


4 commentaires

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, je return solution = 'La solution est:' + results [0] .solution . 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


3 Réponses :


0
votes

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 };
        }
    }
});


1 commentaires

il renvoie "status": false



0
votes

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.


0 commentaires

3
votes

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.


2 commentaires

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