2016-12-11 1 views
0

J'ai écrit un serveur simple, et j'ai rencontré un problème où je reçois une erreur de rappel non définie, malgré le fait qu'il y ait un paramètre de rappel dans mon en-tête de fonction. Chaque exemple que j'ai vu sur Google a été les gens n'ayant pas un paramètre de rappel, mais je semble en avoir un? L'erreur qui est levée est TypeError: callback n'est pas une fonction.NodeJS Callback n'est pas une fonction Chute d'eau asynchrone

code:

app.post("/api/info/", function(req, res){ 
    async.waterfall([ 
     function(callback){ 
      debugger; 
      jwt.verify(req.body.jwt, secret.secret, {ignoreExpiration: false}, 
      function(err, decoded){ 
       console.log(err); 
       console.log(decoded.uuid); 
       debugger; 
       if(err) { 
        debugger; 
        console.log("error1: " + err); 
        debugger; 
        res.json({ 
         status: 403 
        }); 
        res.end(); 
        callback("JWT auth failed", null); 
        return; 
       } 
       debugger; 
       callback(null, decoded.uuid); 
      }); 
     }, 
     function(err, token, callback){ //query db for user uuid 


     debugger; 
     pool.query("SELECT * FROM users WHERE INSTR (uuid," + "'" + token + "') > 0", function(err, rows){ 
      if(err) console.log(err); 
      debugger; 
      callback(rows); //where it errors 
     }); 
    }, 
    function(rows, callback){ //get user's school name 
    debugger; 
     var schoolId = rows[0].chapter_uuid; 
     pool.query("SELECT * FROM chapters WHERE INSTR (uuid," + "'" + schoolId + "') > 0", function(err, result){ 
      debugger; 
      callback(rows, result[0].school); 
     }); 
    }, 
    function(rows, chapter, callback){ //return db results to user in json 
     debugger; 
     var canMakeEvent = 0; 
     if(rows[0].is_board){ 
      canMakeEvent = 1; 
     } 
     var info = { 
      firstName: rows[0].first_name, 
      lastName: rows[0].last_name, 
      email: rows[0].email, 
      chapter: chapter, 
      isBoard: canMakeEvent, 
      boardPosition: rows[0].board_position 
     }; 
     res.json({ 
      status: 200, 
      info: info 
     }); 
     res.end(); 
     debugger; 
     callback(null); 
    } 
], function(err){console.log(err);}); 
}); 
+0

Très bien, * où * obtenez-vous l'erreur? –

+0

Il y a un commentaire dans le code, juste en dessous de "SELECT * FROM users WHERE INSTR". L'en-tête de la fonction async est function (err, token, callback). Désolé si le code est difficile à lire, stackoverflow foiré la tabulation/espacement. –

+0

Merci. J'ai oublié ça. Le problème n'est pas encore évident pour moi. Avez-vous regardé pour voir ce que le rappel est, s'il est défini? Est-ce que tout (comme la validation JWT) fonctionne comme prévu? Je demande, car appeler 'res.end();' * suivi de * 'callback (" échec JWT auth ", ...' me semble inhabituel mais peut-être pas forcément incorrect.) –

Répondre

1
function(err, token, callback){ //query db for user uuid 


    debugger; 
    pool.query("SELECT * FROM users WHERE INSTR (uuid," + "'" + token + "') > 0", function(err, rows){ 
     if(err) console.log(err); 
     debugger; 
     callback(null,rows); //where it errors 
    }); 
}, 

La fonction interne dans pool.query prend 2 paramètres: err et rows. Donc, dans le retour callback, il nécessite 2 paramètres. Depuis le 1er paramètre est err, dans callback utiliser null car il doit être appelé seulement if(!err) condition est satisfaite.