降级那些事情

  • 2019 年 12 月 4 日
  • 笔记

本文作者:IMWeb moonye 原文出处:IMWeb社区 未经同意,禁止转载

降级那些事情

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

小的错误可能只是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。