2015-12-21 1 views
3

Je suis coincé écrire un routeur d'authentification pour une application koa.Comment lancez-vous `yield next` dans une promesse ou un callback?

J'ai un module qui récupère des données de la BD puis les compare à la requête. Je veux exécuter seulement yield next si l'authentification passe.

Le problème est que le module qui communique avec la base de données renvoie une promesse et si j'essaie d'exécuter yield next à l'intérieur de cette promesse, j'obtiens une erreur. Soit SyntaxError: Unexpected strict mode reserved word ou SyntaxError: Unexpected identifier selon que le mode strict est utilisé ou non.

Voici un exemple simplifié:

var authenticate = require('authenticate-signature'); 

// authRouter is an instance of koa-router 
authRouter.get('*', function *(next) { 
    var auth = authenticate(this.req); 

    auth.then(function() { 
    yield next; 
    }, function() { 
    throw new Error('Authentication failed'); 
    }) 
}); 

Répondre

3

Je pense que je compris.

La promesse doit être donnée qui mettra en pause la fonction jusqu'à ce que la promesse soit résolue puis continue.

var authenticate = require('authenticate-signature'); 

// authRouter is an instance of koa-router 
authRouter.get('*', function *(next) { 
    var authPassed = false; 

    yield authenticate(this.req).then(function() { 
    authPassed = true; 
    }, function() { 
    throw new Error('Authentication failed'); 
    }) 

    if (authPassed) { 
    yield next; 
    } 
}); 

Cela semble fonctionner, mais je le mettrai à jour si je rencontre d'autres problèmes.

-1

Vous ne pouvez utiliser yield l'intérieur d'un générateur, mais le rappel que vous devez passer à l » thenPromise est une fonction normale, c'est la raison pour laquelle vous obtenez un SyntaxError.

Vous pouvez réécrire comme suit:

var authenticated = yield auth.then(function() { 
    return true; 
}, function() { 
    throw new Error('Authentication failed'); 
}) 

if (authenticated) yield next 
+0

Cela ne fonctionnerait pas car le rappel dans 'auth.then' ne serait pas exécuté avant le bloc if. C'est asynchrone. De plus, la valeur renvoyée des rappels ne serait pas stockée dans la variable 'authentication'. 'authenticized 'serait juste une autre promesse. –

+0

Désolé, j'ai oublié un "rendement" Je vous assure que cela fonctionne parce que je travaille avec Koa depuis quelques mois et c'est comme ça que je le fais. – Tae

+0

Il ne le serait pas, car la variable 'authenticated' serait simplement une promesse, donc l'instruction if passerait toujours. Si vous jetez un coup d'oeil à ma réponse, voici comment cela devrait être fait. Vous générez la promesse, puis enregistrez le résultat dans une variable, puis vous pouvez utiliser cette variable pour votre instruction if. –