ctx.response.
type
=
'json'
;
app.use()
用來加載中間件
app.
use
(ctx
=>
{ ctx.
body
=
'Hello Koa'
; });
以"先進後出"(first-in-last-out)的順序執行。
- 最外層的中間件首先執行。
- 調用next函數,把執行權交給下一個中間件。
- ...
- 最內層的中間件最後執行。
- 執行結束後,把執行權交回上一層的中間件。
- ...
- 最外層的中間件收回執行權以後,執行next函數後面的代碼。
const one
=
(
ctx
,
next
)
=>
{
console
.
log
(
'>> one'
);
next
();
console
.
log
(
'<< one'
);
}
const two
=
(
ctx
,
next
)
=>
{
console
.
log
(
'>> two'
);
next
();
console
.
log
(
'<< two'
);
}
const three
=
(
ctx
,
next
)
=>
{
console
.
log
(
'>> three'
);
next
();
console
.
log
(
'<< three'
);
}
app
.
use
(
one
);
app
.
use
(
two
);
app
.
use
(
three
);
有以下輸出。
>>
one
>>
two
>>
three
<<
three
<<
two
<<
one
上面都是
同步的中間件
,異步的須要加async
const main
=
async
function
(
ctx
,
next
)
{
ctx
.
response
.
type
=
'html'
;
ctx
.
response
.
body
=
await fs
.
readFile
(
'./demos/template.html'
,
'utf8'
);
};
app
.
use
(
main
);
上面代碼中,
fs.readFile
是一個異步操做,必須寫成
await fs.readFile()
,而後中間件必須寫成 async 函數。
上下文
請求
響應
async function doWork() { // 使用 async/await 的方式依次獲取兩個 JSON 文件 var result1 = await fetch('data1.json'); var result2 = await fetch('data2.json'); return { result1, result2 }; }
這個語法能夠理解爲:被 async 關鍵字標記的函數,
能夠對其使用 await 關鍵字來暫停函數的執行直到異步操做結束。
async
function
indexStep1
(
ctx
,
next
)
{
//邏輯處理第一部分
await
next
();
}
async
function
indexStep2
(
ctx
,
next
)
{
//邏輯處理第二部分
await
next
();
}
async
function
indexStep3
(
ctx
,
next
)
{
//邏輯處理第三部分
await ctx
.
render
(
'index'
);
}
router
.
get
(
'/index'
,
indexStep1
,
indexStep2
,
indexStep3
);
同時實現get和post
router.all
Create routes with multiple HTTP methods using
router.register()
:
app.register(
'/'
, [
'get'
,
'post'
],
function
*
(next)
{
// ...
});
Create route for all methods using
router.all()
:
app.all(
'/'
,
function
*
(next)
{
// ...
});
獲取參數
eventCenter?data1=leijh
var data = ctx.request.query.data || null;