2017-11-01 2 views
0

Ich habe den folgenden Code in meinem Node.js express App:Proper Fehlerbehandlung mit Asynchron/erwarten in Node.js

router.route('/user') 

    .post(async function(req, res) { 
     if(req.body.password === req.body.passwordConfirm) { 
      try { 
       var response = await userManager.addUser(req.body); 
       res.status(201).send(); 
      } catch(err) { 
       logger.error('POST /user failed with error: '+err); 
       res.status(500).send({err:"something went wrong.."}); 
      } 
     } else { 
      res.status(400).send({err:'passwords do not match'}); 
     } 
    }) 

und usermanager:

var userManager = function() { 

    this.addUser = async function(userobject) { 
     userobject.password_hash = await genHash(userobject.password_hash); 
     var user = new User(userobject); 
     return await user.save(); 
    }; 

}; 

module.exports = userManager; 

Meine Frage ist: Wird die versuch catch block in der route catch alle fehler geworfen in addUser oder wird es nur diejenigen fangen, die von user.save() geworfen werden, da das ist das, das zurückgegeben wird?

+0

'addUser' ist eine' async-Funktion' und daher * wird niemals eine Ausnahme ausgelöst *. Es wird nur ein Versprechen zurückgeben, das abgelehnt werden könnte. – Bergi

+2

Nur wenn Sie 'Ihren' addUser' Anruf erwarten ... – James

+0

Ah, schöner Fang, ich habe vergessen, es dort hinzuzufügen! –

Antwort

2

Die Antwort ist ja, es wird alle Fehler innerhalb try blockieren und in allen internen Funktionsaufrufen.

async/await ist nur Syntaxzucker für Versprechen. Wenn also etwas mit Versprechungen möglich ist, dann ist das auch möglich mit async/await.

Zum Beispiel die beiden folgenden Codefragmente sind äquivalent:

Verwendung verspricht:

function foo() { 
 
    return bar(); 
 
} 
 

 
function bar() { 
 
    return Promise.reject(new Error('Uh oh!')); 
 
} 
 

 
function main() { 
 
    return foo().catch(e => { 
 
    console.error(`Something went wrong: ${e.message}`); 
 
    }); 
 
} 
 

 
main();

Verwenden von async/await:

async function foo() { 
 
    await bar(); 
 
} 
 

 
async function bar() { 
 
    throw new Error('Uh oh!'); 
 
} 
 

 
async function main() { 
 
    try { 
 
    await foo(); 
 
    } 
 
    catch(e) { 
 
    console.error(`Something went wrong: ${e.message}`); 
 
    } 
 
} 
 

 
main();


In der Tat wird Ihr Code nicht funktionieren, da Sie nicht await auf userManager.addUser nicht benutzen.

Es zwingt Sie auch, async auf der übergeordneten Funktion zu verwenden, und das kann Dinge aufbrechen. Überprüfen Sie die Express-Dokumentation (oder versuchen Sie es einfach, wenn es funktioniert).

router.route('/user') 

    .post(async function(req, res) { 
     if(req.body.password === req.body.passwordConfirm) { 
      try { 
       var response = await userManager.addUser(req.body); 
       res.status(201).send(); 
      } catch(err) { 
       logger.error('POST /user failed with error: '+err); 
       res.status(500).send({err:"something went wrong.."}); 
      } 
     } else { 
      res.status(400).send({err:'passwords do not match'}); 
     } 
    }) 
+1

Aber OP benutzt * nicht * '' erwarten ''innerhalb des' try' Blocks ?! – Bergi

+0

ja, das war mein schlechtes! –