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

  • 相关阅读:
    js实现弹窗后选择信息填入text标签中以及需要注意的问题
    JDBC链接mysql之后出现read-only
    面试题之心理测试题及答案
    互联网经济思维故事
    模板
    工具包、类
    开源项目
    项目开发工具
    Java API 常用 详解
    spring文章
  • 原文地址:https://www.cnblogs.com/yangzhou33/p/9038695.html
Copyright © 2011-2022 走看看