javascript - Nodejs服务器中 应该何时res.end()呢?
问题描述
有这样的一个场景 ’/blog’ 路由下要处理用户提交的数据假设要把三份数据存储给三个key 然后代码写出来就变成这样
function handlePostBlog(req, res){ resid_client.set( key1, data1, function(err, response){resid_client.set(key2, data2, function(err,response){ resid_client.set(key3, data3, function(err, response){if(response === ’ok’){ res.writeHead(200, ...) res.end()} })}) })}
不考虑好不好看。。虽然用promise包装的好看一些 但是在最后一个回调中res.end()来关闭连接,是不是存在问题?这个请求会被挂起很长一段时间把?一般这种地方应该怎么处理?因为只需要set而不需要返回结果给用户,所以收到请求之后就直接res.end()来关闭连接可以不?
问题解答
回答1:这取决于你是否希望这个 HTTP 请求的返回结果与数据库操作的结果有关联性,以及用户交互设计是否容忍这个操作所花费的时间。
你在设计这个 ’/blog’ 接口时,需要明确指明 HTTP 返回 200 意味着什么。如果你们的业务场景只关心数据交付到后端,不关心后端是否正确存储到数据库,那肯定可以直接结束掉 HTTP 请求。如果你们希望终端用户得到这个确切的提交结果,那需要考虑交互层面了,设计良好的交互效果,2-6秒的等待,用户体验不会很差(指AJAX请求场景下,打开新页面场景下还是慎重)。写三次redis几乎是不花时间,比起 HTTP 请求本身的链路延迟根本不算什么。
具体业务场景还要具体分析。碰到特别耗时的操作,前端提交操作请求后轮训结果也不失为一种解决方案。
回答2:看页面显示和数据库操作结果有没有相关性。如果有相关性,可以等待数据库操作结束之后返回。也可以做成异步队列的方式直接返回,成功后在推送结果。最终怎么样,还是看你需求。
相关文章:
1. mysql - 一个表和多个表是多对多的关系,该怎么设计2. python 如何实现PHP替换图片 链接3. html5 - iOS的webview加载出来的H5网页,怎么修改html标签select的样式字体?4. 一个mysql联表查询的问题5. python如何不改动文件的情况下修改文件的 修改日期6. javascript - git clone 下来的项目 想在本地运行 npm run install 报错7. mysql主从 - 请教下mysql 主动-被动模式的双主配置 和 主从配置在应用上有什么区别?8. angular.js - 三大框架react、vue、angular的分析9. python - django 里自定义的 login 方法,如何使用 login_required()10. 主从备份 - 跪求mysql 高可用主从方案
