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

  • 相关阅读:
    MySQL中内存分为全局内存和线程内存
    mysql 线程级别的缓冲区
    MySQL Handler变量解析
    HANDLER命令与实现
    MySQL Spatial Extensions 地理信息
    C++中临时对象的学习笔记
    HDC与CDC相互转换
    B树
    基于R-Tree的最近邻查询
    地图发布的几种服务的区别
  • 原文地址:https://www.cnblogs.com/yangzhou33/p/9038695.html
Copyright © 2020-2023  润新知