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进行延迟后跳转。
koa中返回404并且刷新后才正常的解决方案的更多相关文章
- django中form页面刷新后自动提交的解决方案
如果一个页面包含了form,同时这个form中的提交按钮是type=submit的input的时候,你刷新该页面,就会有弹窗提示是否重新提交表单,这个特性不胜其烦,常见解决方法有两个: 第一种是前端的 ...
- 实验环境里新创建成功的web application却在浏览器中返回404错误
刚刚翻笔记翻到一些刚学SharePoint时候解决的一些很2的初级问题,本来是有些挣扎该不该把它们记录到这个blog里的?因为担心这些很初级的文章会拉低这个blog的逼格,但是我的哥们善意的提醒了我一 ...
- javascript解决在safari浏览器中使用history.back()返回上一页后页面不会刷新的问题
我们知道,在JavaScript中提供了一个window.history.back()方法用于返回上一页,另外也可以使用window.history.go(-1)返回上一页(跳转). 在其他的主流浏览 ...
- springboot打war包后部署到tomcat后访问返回404错误
springboot打war包后部署到tomcat后访问返回404错误 1.正常情况下,修改打包方式为war <packaging>war</packaging> 2.启动类继 ...
- Flex UI刷新后保持DataGrid中的ScrollBar的位置不变
这是之前我发的一个贴子问题描述:http://q.cnblogs.com/q/53469/
- Shiro踩坑记(二):使用RequiresXXX的注解后,访问对应请求返回404
问题描述: 我在项目中的某个Controller上添加了@RequirePermissions注解,希望在执行该请求前,可以先进行权限验证.但是当我请求该Controller时,返回的确是404错误. ...
- 记录一次 Nginx 配置 proxy_pass 后 返回404问题
一. Nginx 配置 proxy_pass 后 返回404问题 故障解决和定位 1.1. 问题 在一次生产涉及多次转发的配置中, 需求是下面的图: 在配置好了 proxy_pass 之后,请求 ww ...
- 为什么eclipse中启动tomcat后,浏览器中出现404?
问题描述: tomcat压缩包加压后,启动lib文件夹下面的startup.bat,在浏览器中输入http://localhost:8080/后出现熟悉的界面. 但是在eclipse中,jsp可以正常 ...
- ASP.NET中最保险最环保的返回404的方法
代码如下: Response.StatusCode = 404; Response.SuppressContent = true; Context.ApplicationInstance.Comple ...
随机推荐
- JavaScript: For , For/in , For/of
For: define: The for statement can customize how many times you want to execute code Grammar: for (c ...
- C# 数值的隐式转换
Debug2.Log(5/8.0f, 5.0f/8, 5/8);//output:0.625, 0.625, 0 隐式数值转换表
- tcp中delay_ack的理解
内核版本,3.10. 首先,我们需要知道,在一个sock中,维护ack的就有很多变量,多种状态: struct inet_connection_sock { .... __u8 icsk_ca_sta ...
- JS 操作样式 style
1. 任何支持 style 特性的 HTML 元素在 JavaScript 中都对应着有一个 style 属性,指向一个 CSSStyleDeclaration 的一个实例对象,包含该元素的内嵌sty ...
- android studio 创建图标
参考 https://www.cnblogs.com/c546170667/p/5975550.html File-New-Image Asset
- centos7源码安装heartbeat可能出现的错误以及解决办法
问题:ipmilan_command.c: In function 'setup_ipmi_conn':ipmilan_command.c:283:2: error: 'sel_alloc_selec ...
- Individual
individual 英[ˌɪndɪˈvɪdʒuəl] 美[ˌɪndəˈvɪdʒuəl] adj. 个人的; 个别的; 独特的; n. 个人; 个体; [例句]They wait for the gr ...
- HDU 5828 Rikka with Sequence(线段树区间加开根求和)
Problem DescriptionAs we know, Rikka is poor at math. Yuta is worrying about this situation, so he g ...
- HDU 5734 Acperience(数学推导)
Problem Description Deep neural networks (DNN) have shown significant improvements in several applic ...
- linux后台运行命令:&和nohup
常用后台运行命令包含:&和nohup 一.& 使用 当在前台运行某个作业时,终端被该作业占据:可以在命令后面加上& 实现后台运行.例如:sh test.sh & 适合在 ...