概述

这几天学习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进行延迟后跳转

koa中返回404并且刷新后才正常的解决方案的更多相关文章

  1. django中form页面刷新后自动提交的解决方案

    如果一个页面包含了form,同时这个form中的提交按钮是type=submit的input的时候,你刷新该页面,就会有弹窗提示是否重新提交表单,这个特性不胜其烦,常见解决方法有两个: 第一种是前端的 ...

  2. 实验环境里新创建成功的web application却在浏览器中返回404错误

    刚刚翻笔记翻到一些刚学SharePoint时候解决的一些很2的初级问题,本来是有些挣扎该不该把它们记录到这个blog里的?因为担心这些很初级的文章会拉低这个blog的逼格,但是我的哥们善意的提醒了我一 ...

  3. javascript解决在safari浏览器中使用history.back()返回上一页后页面不会刷新的问题

    我们知道,在JavaScript中提供了一个window.history.back()方法用于返回上一页,另外也可以使用window.history.go(-1)返回上一页(跳转). 在其他的主流浏览 ...

  4. springboot打war包后部署到tomcat后访问返回404错误

    springboot打war包后部署到tomcat后访问返回404错误 1.正常情况下,修改打包方式为war <packaging>war</packaging> 2.启动类继 ...

  5. Flex UI刷新后保持DataGrid中的ScrollBar的位置不变

    这是之前我发的一个贴子问题描述:http://q.cnblogs.com/q/53469/

  6. Shiro踩坑记(二):使用RequiresXXX的注解后,访问对应请求返回404

    问题描述: 我在项目中的某个Controller上添加了@RequirePermissions注解,希望在执行该请求前,可以先进行权限验证.但是当我请求该Controller时,返回的确是404错误. ...

  7. 记录一次 Nginx 配置 proxy_pass 后 返回404问题

    一. Nginx 配置 proxy_pass 后 返回404问题 故障解决和定位 1.1. 问题 在一次生产涉及多次转发的配置中, 需求是下面的图: 在配置好了 proxy_pass 之后,请求 ww ...

  8. 为什么eclipse中启动tomcat后,浏览器中出现404?

    问题描述: tomcat压缩包加压后,启动lib文件夹下面的startup.bat,在浏览器中输入http://localhost:8080/后出现熟悉的界面. 但是在eclipse中,jsp可以正常 ...

  9. ASP.NET中最保险最环保的返回404的方法

    代码如下: Response.StatusCode = 404; Response.SuppressContent = true; Context.ApplicationInstance.Comple ...

随机推荐

  1. Unity 获取指定资源目录下的所有文件

    string path="Assets";//Assets/Scenes if(Directory.Exists(path)){ var dirctory=new Director ...

  2. 虚拟网络VDC与VPC

    当前互联网行业,内部 IT 基础资源云端化是主要趋势.云平台将资源管理抽象出来,比如云主机.云 DB 等,以服务的方式提供给用户,按需使用,从而带来更大的灵活性与经济性. 随着主机.DB.缓存.存储等 ...

  3. 解决Windows 10 1803 April 2018 Updatete不能网络共享的问题

    Windows 10升级到1803后便不能网络共享了,现在我用的是Widnows 10 1809 Oct 2018 Update依然存在这个问题. 为了能够共享文件和文件夹需要去windows ser ...

  4. cdnbest架设cdn同一个源用不同的端口访问如何设置

    在站点里的应用防火墙-->高级设置里配置 比如test.com要同时用80和88访问

  5. 做u盘启动重装系统 进winPE 出现 cdboot:couldn't find ntldr 解决办法

    公司的QA本来用的ubuntu系统 觉得不是很好使 就找我重装win10系统  之前有重装过系统 就信心满满的答应了 我拿出U盘 把U盘格式化了下 去下载了个雨林木风的win10 系统(ISO文件) ...

  6. mybatis多表关联

    1.比如我有两个一个是菜单表t_menu,一个是权限表t_jurisdiction.表结构如下: 2.我想要将这两个表关联,查询特定的role_id下的菜单情况,这也是我们经常用在权限管理系统中的做法 ...

  7. mysql查询数据

    select column,column from table where clause [limit n] [offset]; 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用W ...

  8. java多线程系列10 阻塞队列模拟

    接下来的几篇博客会介绍下juc包下的相关数据结构 包含queue,list,map等 这篇文章主要模拟下阻塞队列. 下面是代码 import java.util.LinkedList; import ...

  9. Object.defineProperty之observe实现

    对数据对象的属性批量劫持设置: <script type="text/javascript"> function observe(data){ if(!data || ...

  10. 兼容IE8的flash上传框架"uploadify"自定义上传按钮样式的办法

    (uploadify版本:3.2.1 ) 因为公司业务的原因,所做的项目需要兼容IE8,因此做的上传插件无奈选择的是基于flash的uploadify. 由于是基于flash的,所以使用过程中,难以给 ...