降级那些事情

降级那些事情

页面上线的时候,偶尔会有些特殊或者比较极端的情况,导致页面报错。

小的错误可能只是console控制台上的一个error提示,大的错误可能会导致页面无法正常使用,更严重的可能是页面都没法正常展示。

这边聊聊如何可以有效的避免一些错误,或者如何在错误的时候做兼容,让代码或者页面更有健壮性。

变量级别

通常一个场景是,函数接受一个参数,或者从接口中返回数据,要对这些数据做处理。使用接口的人或者说后台是不会告诉你参数到底会不会有异常(难道告诉你了你就可以放心的不管了?)。

function a(opts) {
    var v = opts.v;
}

这样如果入参是undefined或者null的话,那么这句就直接报错。通常做法是

function a(opts) {
    opts = opts || {};
    var v = opts.v;
}

这里有一个做法是使用es6的默认值,但如果传的参数是null,这边会怎样? function a(opts={}) { var v = opts.v; }

代码块级别

还有一种异常是发生在异步请求或者代码运行过程中的异常,异常一般是在error回调或者trycatch里处理,也是比较常见的方式了

var a;
try {   
    a = JSON.parse('')
} catch(e) {    
    a = {}
}

以上两种处理方式比较常见,一般异步页面里用的比较多,点虽然小,但比较有用。

接下来说是页面级别的降级或者说错误兼容。

页面降级

对于外部请求不存在的资源,通常我们是返回一个定制的404页面。而对于访问了服务器直出的页面,直出页面不可用时,简单粗暴的404就不那么适用了。

这个时候,我们需要的是能够提供和重要页面体验一样的异步页面给到用户,让用户感知不到这里的问题。

这里就提出了一个新的要求,降级的异步页面哪里来。

  • 手动写一个
  • 同构

ps:这里主要讲降级,所以这块具体实现不再扩展。

降级可以由直出服务来处理,比如在error的时候重定向(重定向的url和当前url是不一样的,一样的话就跪了),或者在error的时候返回一个标志位,业务代码依据标志位执行异步请求以及数据渲染的逻辑。

        .catch(function(err) { // 错误处理
            logger.error(err, err.errMsg);
            Index.oldIndex(param, request) // 暂时降级为老首页
                .then(function(result) {
                    return reply(result);
                }, function(err) {
                    return Tool.errorRedirect(reply, err.errCode);
                });
        });

直出服务处理会有个问题,直出服务挂了该怎么办。

这个时候该接入层(nginx)上场了,在当前location中配置降级策略。

error_page 404 500 501 502 503 504 = /fallback.html;

目前我们采用的做法在上面,但其实也面临一个问题是,nginx规则经常变,如果nginx挂了,咋办?

这个时候可以做的是,利用多层nginx代理,上层代理对重要页面做降级处理,下层代理就是常规的业务nginx配置。

cgi降级

cgi是需要部署在不同的地区不同的机房中,但万一真的cgi也挂了,页面降级再多也是徒劳。所以摆在我们面前的就是cgi挂了怎么办。 同样,我们可以在接入层(nginx)来做这件事情。

location /cgi-bin/data {    
    error_page 404 500 501 502 503 504 = /fallback.json;
}

总结

问题总是层出不穷,而我们要做的就是守好自己那一片土地。

一方面我们需要提升代码的健壮性,review代码,降低可能出问题的风险。另一方面,凡是想到万一,如果问题发生之后,我们该如何处理。

愿皮神保佑,代码无bug。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯社交用户体验设计

高效编写微信小程序-你还在手动创建新项目吗?

2333
来自专栏谈补锅

<转>iOS性能优化:Instruments使用实战

最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下。

1032
来自专栏SDNLAB

SDNLAB技术分享(五):浅谈Open vSwitch移植

前一段时间自己私下一直学习Open vSwitch。起初学习Open vSwitch的目的,只是为了更好的学习OpenFlow协议,然而当我看到Open vSw...

4199
来自专栏从零开始学自动化测试

appium+python自动化49-yaml管理定位元素

如何高效管理定位元素,这个是很有学问的问题,也是面试必问的[以下纯属个人观点,勿喷!]。

1951
来自专栏IT大咖说

vSAN架构解析与6.7功能介绍

内容来源:2018 年 7 月 17 日,VMware大中华区原厂高级技术讲师史峻在“VMware直播分享 第二期”进行《vSAN架构解析与6.7功能介绍》演讲...

2253
来自专栏phodal

微信小程序剖析【下】:运行机制

在上一篇《微信小程序「官方示例代码」浅析【上】》中,我们只是简单的罗列了一下代码,这一篇,让我们来玩点刺激的——就是看看IDE的代码,了解它是怎么运行的。 还好...

3068
来自专栏宋凯伦的技术小栈

【Node.js】初识Node.js

  因组里项目需要,我和另外一名同事要学习Node.js。之前接触过Javascript,都是前台处理html时用到,现在要用Javascript做后端,学习N...

2149
来自专栏小特工作室

工作流组件示例(全部开源)

1.概述 1.1简介 本文档旨在帮助开发人员快速使用工作流组件,完成OA或审批等涉及到工作流组件的系统开发工作 1.2组件构成 1.2.1组件层次图 ? 组...

70810
来自专栏FreeBuf

KindEditor开源富文本编辑框架XSS漏洞

0×01 前言 KindEditor 是一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开发人员可以用 KindEditor 把传统...

3858
来自专栏LeoXu的博客

有意思,使用FtpClient上传文件,上传后的文件总是会莫名奇妙的变大

代码主要是从手机上选择照片上传到服务端,具体实现逻辑中,服务端会先将上传请求中的文件数据放到服务端机器的缓存目录,然后再从缓存目录挪到另外一台FTP服务其中。

812

扫码关注云+社区