Je suis occupé de bosser avec Vapor et je me posais une question: comment faire pour retourner une erreur quand on est dans une closure dans une route ?
Je m’explique:
Quand on a une route GET comme celle-ci par exemple:
app.get("activities") { request -> String in
// Le code de la route
}
On peut throw une erreur comme ça:
app.get("activities") { request -> String in
throw Abort(.badRequest)
}
Mais qu’en est-il si dans cette route, on appelle un web service externe par exemple ?
Comme ceci:
app.get("activities") { request -> String in
client.execute(request: myRequest).whenComplete { result in
// Comment throw une erreur ici ?
}
}
J’ai essayé avec throw Abort(.badRequest), mais Xcode n’a pas l’air ravi:
Mais je suis pas sur de comprendre comment ils l’utilisent… Dans mon cas, le code tel quel ne fonctionne pas, je dois utiliser une variable, et ensuite j’ai le même soucis.
Bref, si vous avez une idée de comment je peux m’en sortir, je suis preneur (et si c’est expliqué dans le cours sur Vapor de @mbritto, je suis preneur si vous savez m’indiquer où trouver l’info)
À ce que je vois sur ton message d’erreur, la fonction ne supporte pas le throwing, donc par rapport à la documentation de Vapor, c’est bien ce que tu as trouvé sur internet.
À savoir :
guard let user = user else {
req.eventLoop.makeFailedFuture(Abort(.notFound))
}
return user.save()
Je pense surtout qu’il ne faut pas utiliser la fonction whenComplete dans ton cas car elle ne retourne rien. C’est juste un callback pour executer du code non lié à ta tâche principale.
Tu devrais plutôt utiliser map, flatMap et flatMapThrowing pour finaliser ton résultat en fonction de l’étape précédente.
Dans les flatMap tu peux retourner un futur en erreur et dans les flatMapThrowing tu peux lancer des exceptions
J’ai changé le whenComplete par un flatMapThrowing, du coup en effet, j’arrive bien à compiler mon code (c’est déjà un bon point). Par contre, quand j’exécute mon app Vapor, dès que j’appelle cette route, j’ai un crash: