降级那些事情

降级那些事情

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

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

相关文章

来自专栏知识分享

有人WIFI模块使用详解

 补充 模块在连接路由器时如果希望模块固定IP 不过发现固定IP之后好像连接路由器的等待时间增加了 ? ? 用的这一款 ? 看一下现在可能用到了引脚 ? ? 这...

3315
来自专栏顶级程序员

记一次惊心的网站TCP队列问题排查经历

此时问题已经影响到整个网站的正常业务,我的那个心惊的呀,最主要报警系统没有任何报警,服务运行一切正常,瞬时背上的汗已经出来了。但还是要静心,来仔细寻找蛛丝马迹,...

662
来自专栏北京马哥教育

sysctl.conf学习和调优

? 前言 记得第一次接触/etc/security/limits.conf和/etc/sysctl.conf时 是因为部署Oracle时要按需修改内核参数。l...

4017
来自专栏IMWeb前端团队

Nginx能为前端开发带来什么?

本文作者:IMWeb 黎腾 原文出处:IMWeb社区 未经同意,禁止转载 Nginx那么好,我想去看看。 接连逛了两个书城后,我发现并没有Nginx相...

2095
来自专栏张善友的专栏

HTTP Basic Authentication for RESTFul Service

面对用户认证的问题。最常见的实现方式一般是这样的:用户提交一个含有用户名和密码的表单,服务端脚本验证其合法性,如果通过验证,则在Session里标识一下,如此一...

20910
来自专栏北京马哥教育

HTTP/2 十分钟速知

升级到 HTTP/2 后,那些针对HTTP/1.x 的优化手段需要如何变化? 答:总结来说,除了多域名增加并行 TCP 连接数不再适用以外,启用 HTTP/2...

3878
来自专栏FreeBuf

打造一款属于自己的远程控制软件(一)

本人为了工作中便于管理手中大量的计算机一直在寻找一款合适的远程控制软件。鉴于网上下载的远程控制软件大多都被不同程度地植入后门,于是萌生了自己打造一款远控的想法,...

7798
来自专栏陈纪庚

SPA页面初试

632
来自专栏数据之美

linux 系统监控、诊断工具之 IO wait

1、问题: 最近在做日志的实时同步,上线之前是做过单份线上日志压力测试的,消息队列和客户端、本机都没问题,但是没想到上了第二份日志之后,问题来了: 集群中的某台...

28510
来自专栏CSDN技术头条

XEN、VMware ESXi、Hyper-V以及KVM架构解析

XEN 有简化虚拟模式,不需要设备驱动,能够保证每个虚拟用户系统相互独立,依赖于 service domains 来完成一些功能; Vmware ESXI 与 ...

60610

扫码关注云+社区