2017-08-22 2 views
3

J'essaie d'enrouler ma tête autour de la façon dont koajs cascades en attendant "next()" avant de reprendre le traitement des requêtes. Pour autant que je sache, "next" se réfère simplement à la prochaine application app.use() dans le script.koa js: Que veut dire "next", et la cascade peut-elle être implémentée différemment?

Quelqu'un de plus familier avec koajs peut-il le confirmer? Par exemple, ce code (modifié à partir de koajs.com) fonctionnerait-il encore (foo et bar étaient "next")?

app.use(async (ctx, foo) => { 
    const start = Date.now(); 
    await foo(); 
    const ms = Date.now() - start; 
    ctx.set('X-Response-Time', `${ms}ms`); 
}); 

app.use(async (ctx, bar) => { 
    const start = Date.now(); 
    await bar(); 
    const ms = Date.now() - start; 
    console.log(`${ctx.method} ${ctx.url} - ${ms}`); 
}); 

app.use(async ctx => { 
    ctx.body = 'Hello World'; 
}); 

Y a-t-il quelque chose de magique à propos de l'utilisation de "next" (en plus de la bonne sémantique)? Je suppose que non, et le comportement est juste dépendant de l'ordre des arguments dans la fonction.

Si c'est le cas, alors comment est-il possible de contrôler le flux d'un app.use() à un autre? Par exemple quelque chose comme ce code pseudo:

app.use(async (ctx, a, b) => { 
    if (!ctx.something) { 
    await a(); 
    } else { 
    await b(); 
    } 
    } 

    let a = app.use(.....); 
    let b = app.use(.....); 

Toute aide est appréciée, et aussi, ne hésitez pas à me pointer vers une ressource appropriée si je l'ai raté quelque chose de simple.

Répondre

0

Il n'y a rien de magique appeler le second paramètre à votre middleware next. Vous êtes libre d'appeler foo ou bar ou tout autre nom légal (même si bien sûr les futurs programmeurs trouveront confus!).

Middleware Koa fonctionne en une seule manière semblable à pile, il est donc impossible de fournir intergiciels multiples que possible « NExT » actions comme dans votre deuxième exemple.

Vous pouvez mettre en œuvre l'exécution conditionnelle en enroulant intergiciels à l'intérieur de l'autre bien. Il y a un bon example dans le repo Koa github.