koa中返回404並且刷新后才正常的解決方案


概述

這幾天學習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進行延遲后跳轉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM