2017-03-01 64 views
2

爲什麼我們做這個爲什麼我們在使用koa路由器時等待下一次?

router.get('/data', async (ctx, next) => { 
    ctx.body = dummyjson.parse(data); 
    await next(); 
}); 

router.get('/data/:x', async (ctx, next) => { 
    const newData = dataRepeat.replace('%(x)', ctx.params.x); 
    ctx.body = dummyjson.parse(newData); 
    await next(); 
}); 

什麼用的await next()

它的工作而沒有就好。類似的事情預計與koa 1. yield next被添加在路由器的末尾。

+0

[這個答案](http://stackoverflow.com/questions/10695629/what-is-the-parameter-next-used-for-in-express)是快遞,不興亞但其基本上是相同的推理。 – saadq

回答

1

我會試着用一個非常笑着例子來解釋一下:

const Koa = require('koa'); 
const app = new Koa(); 

// middleware 
app.use(async function (ctx, next) { 
    console.log(1) 
    await next(); 
    console.log(3) 
}); 

// response 
app.use(ctx => { 
    console.log(2) 
}); 

app.listen(3000); 

如果你在瀏覽器中調用localhost:3000,下面會發生在你的應用程序:

  • 第一app.use那你在這裏開除的是middleware。因此,請求流首先進入該控制檯,並將日誌1記錄到控制檯。
  • 然後,當你看到這個await next()時,它下游到下一個use
  • 這裏我們只是將2登錄到控制檯。當這完成時(並且在第二個use中沒有再看到下一個,則流程返回到第一個女巫實際等待的時間,直到第二個完成。直到第二個完成。
  • 這裏我們繼續記錄3到控制檯。

希望這使得它更加清楚一點。

0

不,這是沒有必要的。這是取決於你的需求。 當你調用next中間件使用next()函數。

Chec k您的路由器模塊及其版本。我有使用koa路由器模塊,其版本是7.2.0路由。它自己處理下一個等待。

'use strict'; 

const Koa = require('koa'), 
    router = require('koa-router'), 
    app = new Koa(); 

let pubRouter = new router(); 
let securedRouter = new router(); 

let mapper = require('./mapper'), 

// assign router to corresponding function 
mapper(pubRouter, securedRouter); 

app .use(logger(config.app.log))  
.use(bodyParser()) 
.use(pubRouter.routes()).use(pubRouter.allowedMethods()) 
    .use(jwt({ 
     secret: publicKey, 
     algorithms: ['RS256'] 
    })) 
    .use(async(ctx, next) => { 
     console.log('\n\n\n\n\n', ctx.state.user); 
     await next(); 
    }) 
    .use(securedRouter.routes()).use(securedRouter.allowedMethods()) 
    .use(async(ctx, next) => { 
     ctx.body = 'Invalid URL!!!'; 
    }); 

app.listen(port,() => console.log(`Server listening on port: ${port}`)); 
相關問題