降级那些事情

降级那些事情

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

小的错误可能只是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 条评论
登录 后参与评论

相关文章

来自专栏技术小讲堂

iBaits.Net(1):简介与安装

iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的JPetStore实例。 ...

2607
来自专栏散尽浮华

分布式监控系统Zabbix-3.0.3--短信报警设置

前面已分别介绍了zabbix的邮件、微信报警设置,这些都是手机在有网络时才能收到报警信息,那如果手机没有网的情况下怎么办,这就需要考虑使用短信接口报警了。当服务...

2498
来自专栏菩提树下的杨过

[biztalk笔记]-1.Hello World!

开始接触biztalk了,这个东西感觉不象linq,silverlight等具体的技术好学,看了几天文档,也跑通了一些小示例,但是仍然觉得毫无感觉,只大概的知道...

1896
来自专栏安富莱嵌入式技术分享

【安富莱】【RL-TCPnet网络教程】第8章 RL-TCPnet网络协议栈移植(RTX)

本章教程为大家讲解RL-TCPnet网络协议栈的RTX操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移植就比较容易了,主要是添加库文件、配置文件和驱...

954
来自专栏Android机动车

Android从立项到上线——修仙之路

名称结构为“技术点模块点空间类型_功能名”结构,技术点主要有:selector、translate、alpha、scale等,模块名主要有:login、pay、...

772
来自专栏Android 开发者

[译] 在 SnackBar,Navigation 和其他事件中使用 LiveData(SingleLiveEvent 案例)

1493
来自专栏IMWeb前端团队

如何在前端编码时实现人肉双向编译

本文作者:IMWeb yisbug 原文出处:IMWeb社区 未经同意,禁止转载 如何在前端编码时实现人肉双向编译 React+flux是目前最火的前...

1745
来自专栏知无涯

PHP程序员应该知道的15个库

3419
来自专栏技术之路

golang 使用pprof和go-torch做性能分析

    软件开发过程中,项目上线并不是终点。上线后,还要对程序的取样分析运行情况,并重构现有的功能,让程序执行更高效更稳写。 golang的工具包内自带ppro...

732
来自专栏华仔的技术笔记

iOS 性能优化常用技巧总结import

2827

扫码关注云+社区