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

概述

这几天学习koa2,有一些心得,记录下来,供以后开发时参考,相信对其他人也有用。

起因

这几天学习koa2,写的代码执行时有一个奇怪的bug:明明能够返回数据,却有时正常返回数据,有时偏偏给你返回404,很头疼。问传统后端,都不懂koa;上网查资料,怀疑是bodyparser的bug,于是换了另一个koa-body中间件来解析post请求,还是会出现这个bug。

直到我去github上面查别人koa2 + mongoose的代码,才发现是异步的问题。总结起来解决方案是这样的:既然koa2里面用了async,那就不要用回调!!!

代码

之前我的代码是这样的,并且是按照mongoose官方demo写的

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进行延迟后跳转

猜你喜欢

转载自www.cnblogs.com/yangzhou33/p/9038695.html