概述
這幾天學習koa2,有一些心得,記錄下來,供以后開發時參考,相信對其他人也有用。
起因
這幾天學習koa2,寫的代碼執行時有一個奇怪的bug:明明能夠返回數據,卻有時正常返回數據,有時偏偏給你返回404,很頭疼。問傳統后端,都不懂koa;上網查資料,懷疑是bodyparser的bug,於是換了另一個koa-body中間件來解析post請求,還是會出現這個bug。
直到我去github上面查別人koa2 + mongoose的代碼,才發現是異步的問題。總結起來解決方案是這樣的:既然koa2里面用了async,那就不要用回調!!!
代碼
之前我的代碼是這樣的,並且是按照[mongoose官方demo](http://www.nodeclass.com/api/mongoose.html#Getting Started)寫的
await User.findOneAndRemove({ 'username': username}, function(err, users) {
ctx.type = 'text';
ctx.body = '修改成功';
})
下面是我修改后的代碼:
const res = await User.remove({ 'username': username});
ctx.type = 'text';
ctx.body = '修改成功';
其中有個不同,就是一開始的代碼雖然使用了await,但同時也使用了回調。於是我猜測,在服務器返回數據的時候,這個回調函數造成了一定的延遲,所以數據並沒有及時返回,於是出現了404錯誤,過一段時間后數據才正常返回,於是刷新后就好了。
koa中使用回調
那有一些需要使用回調的函數怎么辦呢?比如說setTimeout函數。方法是把它包裝在一個promise里面。
實例代碼如下:
//util.js
let delay = function (time) {
return new Promise(function (resolve, reject) {
//Pending 進行中
setTimeout(function () {
// 從 pending 變為 resolved
resolve();
}, time);
})
};
module.exports = delay;
//delete.js
const delay = require('./../utils/util');
//do something
await delay(3000);
//do something
這樣就能夠延遲3秒才做出響應了。但是並不建議這么做,因為在這3秒內,用戶界面是沒有任何響應反饋的。那怎么解決呢?我目前能想到的解決方案是,讓前端利用location進行延遲后跳轉。