zoukankan      html  css  js  c++  java
  • 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进行延迟后跳转

  • 相关阅读:
    element:记一次重置表单引发提交数据为默认数据现象
    三种常用又简单的排序算法
    (07)GitHub从2021.08.13开始使用Token代替账号和密码
    does not implement methodSignatureForSelector:
    自用python库
    2048
    CCSP2021游记
    2021 CCPC 桂林站游记
    2021 ICPC 沈阳站游记
    2021SDU新生赛游记
  • 原文地址:https://www.cnblogs.com/yangzhou33/p/9038695.html
Copyright © 2011-2022 走看看