2017-10-06 2 views
-1

Ich schreibe ein Registrierungssystem in Node/Express und ich versuche, Promises zu nutzen.Pause Versprechen Kette - stoppen Sie die nächste 'dann' von der Ausführung

Das Problem ist, dass ich eine Fehlermeldung erhalten, wenn sie mit:

Fehler:

(node:64725) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2):

Gibt es eine Möglichkeit zu einem then zu stoppen?

auth.isRegistered(email) 
.then((registered) => { 
    if (!registered) { 
     req.flash('pleaseRegister', 'Looks like you haven\'t registered. Please register first.'); 
     req.session.user = user; 
     res.redirect('/register') 
    } 
}) 
.then(() => { 
    return auth.isVerified(email); 
}) 
.then((verified) => { 
    if (!verified) { 
     console.log('please verify'); 
     res.redirect('/register/verify'); 
    } else { 
     req.login(user, err => { 
      if (err) return next(err); 
      req.session.timestamp = Date.now(); 
      auth.updateLastLogin(email) 
      .then(() => { 
       res.redirect(req.session.returnTo || '/account'); 
      }); 
     }); 
    } 
}); 
+1

Zuerst scheint Fehler Sie wie eine Warnung. Zweitens, haben Sie versucht, Ihrem Versprechen einen "Fang" -Anruf hinzuzufügen? –

+0

'if' /' else' wie du es im letzten 'then' Callback machst sollte in Ordnung sein, mach das selbe für' if (! Registriert) '. – Bergi

+0

Welches Versprechen wird abgelehnt, mit welchem ​​Fehler? Sie scheinen nie irgendwelche Fehler bei irgendwelchen Versprechungen zu "fangen", so dass dies zu erwarten ist. – Bergi

Antwort

-2

Sie müssen return etwas, wenn Sie ein Versprechen auf „stopp“ wollen. Oder Promise.resolve, Promise.reject()

In diesem Fall zum Beispiel:

if (!registered) { 
 
    req.flash('pleaseRegister', 'Looks like you haven\'t registered. Please register first.'); 
 
    req.session.user = user; 
 
    return res.redirect('/register') 
 
}

+3

Die Rückkehr von einem 'then()' Callback stoppt nicht das nächste 'then()'. –

-1

UnhandledPromiseRejectionWarning: Unbehandelte Versprechen Ablehnung (Ablehnung ID: 2): Ich glaube, das liegt daran, dass Sie keine haben Möglichkeit, den Fehler in Ihrem ursprünglichen .thens zu behandeln, deshalb erhalten Sie den obigen Fehler. Es "stoppt" dann nicht, sondern behandelt den Fehler korrekt. Du könntest (err) => {return} machen, was es im Wesentlichen "stoppen" würde, aber seine Flusskontrolle in deiner Anwendung.

-1

Es ist nicht klar welchethen() Sie versuchen zu stoppen. Aber Sie werden besser dran sein, wenn Sie keine Logik verketten und verzweigen. Wenn man also Dinge einfügt, ist das Ende jeder Verzweigung eine einzige Antwort. Ich persönlich denke, es wäre besser, wenn möglich, die Tests für registrierte und verifizierte in ihrer eigenen Middleware zu platzieren. Ich habe es nicht in das Beispiel aufgenommen, aber Sie könnten in Erwägung ziehen, catch() hinzuzufügen, um Fehler zu behandeln.

auth.isRegistered(email) 
.then((registered) => { 
    if (!registered) { 
     req.flash('pleaseRegister', 'Looks like you haven\'t registered. Please register first.'); 
     req.session.user = user; 
     return res.redirect('/register') 
    } 
    return auth.isVerified(email) 
    .then((verified) => { 
     if (!verified) { 
      console.log('please verify'); 
      return res.redirect('/register/verify'); 
     } 
     req.login(user, err => { 
      if (err) return next(err); 
      req.session.timestamp = Date.now(); 
      auth.updateLastLogin(email) 
      .then(() => res.redirect(req.session.returnTo || '/account')); 

     }) 
    })  
}) 
+1

Verwenden Sie nicht die Anweisung "else", sondern _return early_.Vermeide es, zu viele geschachtelte Versprechensketten zu verwenden. Und Sie geben das Versprechen, das von 'auth.isVerified' erstellt wurde, nicht zurück, so dass Sie immer noch 'UnhandledPromiseRejectionWarning' erhalten können. – alexmac

+0

@alexmac ja, natürlich, danke. –

0

Sie können folgendes tun:

  1. Werfen Sie einen benutzerdefinierten Fehler, wenn Sie das Versprechen Kette brechen wollen.
  2. Einchecken catch Rückruf, dass geworfene Fehler ist ein benutzerdefinierter Fehler. Wenn ja, einfach weiter, rufen Sie sonst next mit error Objekt:

Beispiel:

let getBreackChainError =() => { 
    let err = new Error(); 
    err.name = 'BreackChainError'; 
    return err; 
}; 

auth 
    .isRegistered(email) 
    .then(registered => { 
     if (!registered) { 
     req.flash('pleaseRegister', 'Looks like you haven\'t registered. Please register first.'); 
     req.session.user = user; 
     res.redirect('/register'); 
     throw getBreackChainError(); 
     } 
     return auth.isVerified(email); 
    }) 
    .then(verified => { 
     if (!verified) { 
     console.log('please verify'); 
     res.redirect('/register/verify'); 
     throw getBreackChainError(); 
     } 
     return new Promise((resolve, reject) => { 
     req.login(user, err => { 
      if (err) { 
      return reject(err); 
      } 
      req.session.timestamp = Date.now(); 
      resolve(); 
     }); 
     }); 
    }) 
    .then(() => auth.updateLastLogin(email)) 
    .then(() => res.redirect(req.session.returnTo || '/account'); 
    .catch(err => { 
    if (err.name !== 'BreackChainError') { 
     next(err); 
    } 
    }); 

Hinweis. Sie sollten Rückrufe nicht mit Versprechen kombinieren, verwenden Sie etwas. In dem obigen Beispiel, I promitifiziertereq.login, so jetzt gibt es ein Versprechen.

+0

Downvoter, bitte erklären, was ist los mit meiner Antwort? – alexmac

+0

Ich werfe den "getBreackChainError" dann node.js beendet das Skript ... Ich will es die Versprechungskette stoppen nicht das ganze Ding beenden! – AKMorris

+0

Das Problem gefunden - Ich habe Promise.Reject verwendet, anstatt die Zurückweisung über die Funktionsparameter zu übergeben, wenn jemand schnell erklären kann, warum ich es schätze, wenn nicht schlecht, erstelle meinen eigenen Thread. – AKMorris

Verwandte Themen