一般咱们写 bug,哦,不对,写代码时总不会一路顺风,每每各类 bug 充斥其中,即便测试有较高的代码覆盖率每每也会有漏网之鱼。能写出一些比较隐蔽或者看起来像 feature 的 bug,而且通过了测试、code review 等层层的考验,最终 merge 到主干,这也算的上是一种本事。html
此次,咱们讨论的场景是,当你制造的 bug 被别人发现或者不当心把本身坑了,而不得不去 fix,且你本身也忘了这个 bug 是怎么写的了,在这种状况下,如何排查问题?node
var request = require('request'); exports.handler = function(event, context, callback) { console.log("event: " + event); console.log('context: ', JSON.stringify(context)); const options = { url: 'https://saweather.market.alicloudapi.com/spot-to-weather?area=%E6%B3%B0%E5%B1%B1&need3HourForcast=0&needAlarm=0&needHourData=0&needIndex=0&needMoreDay=0', headers: { Authorization: 'APPCODE 5d9129e294fc4f518793ae9f9a15dbff' } } request(options, function (error, response, body) { if (error || response.statusCode != 200) { console.log("error " + error); return } console.log(body.day_weether); }); };
很简单的一个 nodejs 函数,刚刚接触函数计算每每会意气风发的一口气抒写出这样一段代码,一般是为了简单测试一下函数的使用流程。可是发布到上去后,却出现了调用超时的问题。git
首先,在无从下手的状况下,你大胆猜想以下:github
为了排除其中的 3 选项,首先经过 fun local,在本地运行测试:json
fun local invoke nodejs_timeout
获得结果:api
能够看到,程序也被卡在这里了。由此,能够排除掉 3 的可能性。函数
接着,能够经过加一些日志,或者单步调试来进一步缩小排查的范围,这里选用单步调试,由于这种方法每每更简单。工具
首先,利用 VSCode 在侧边栏下一个断点:学习
而后使用如下命令将函数以调试的方式运行起来(调试基本用法 参考,这里再也不过多阐述):测试
fun local invoke -d 3000 nodejs_timeout
而后单击 VSCode 的开始调试按钮进行调试:
能够看到,函数被正确的调用了,且进入到了入口函数。到此为止,能够排除掉 1 的可能性。
接下来,就要确认 2 可能性中存在的问题。
在 request 处的代码设置断点,continue 到里面,而后在 Local 能够看到运行到此处时的变量的值。
能够看到,http 请求返回的 resposne 的 statusCode 为 200,符合预期。body 也是有数据的,这个也符合预期。
把 body.weakday
放到 watch 里面执行一下,看下结果。
这个就不是预期中的值了。
仔细看下 body 这个对象,发现其显示格式不对,经过 typeof 将 body 的类型打印出来:
这货居然是个 string
!
刚想破口大骂,但一想这代码是本身写的,赶忙闭嘴。
那就转成 json 吧。
但转完后,发现事情更不对了,day_weether 并不直接在 body 下,而是隐藏的很深。
并且名字不叫 day_weether,这里有个拼写错误。正确的写法应该是:
JSON.parse(body).showapi_res_body.f1.day_weather
What the.... 脏话都到嘴边了,但一想代码本身写的,总不能骂本身吧,赶忙修吧。
把正确的表达式贴到 Watch 里面,查看,果真可以取到正确的值:
验证完毕后,将正确的值粘贴到代码中,心想,总算解决了。
从新运行一下函数,发现果真可以取到数据了:
但函数依旧卡在这里,并无继续往下走————超时的问题依旧存在!
如今,愤怒的心情已经没有了,取而代之的是蓝瘦,香菇。站起身,望望窗外,让冷风肆虐你的脸庞。许久,内心平静一些了。
冷静下来,理一理线索:
从刚才的调试结果来看,函数已经运行,且得到了正确的结果,可是函数却没有结束,直到超时。忽然,一个隐约的答案在你身边徘徊,你拼命想要抓住,来回踱步,蓦地,像是出现了救命稻草通常,打开了函数计算 Nodejs 的 文档,你用尽力气摆动眼球,快速阅读文档,并在内心恳求那根救命稻草的出现。恍然间,你如同穿越了一道厚重的铁门,身边的光线忽然由暗变亮,你被这明亮的光线刺的睁不开眼睛。但你知道,答案就在这刺眼的光芒里。眼泪,没能止住,顺着你的脸庞缓慢地流了下来。终于,你松开了紧握的拳头,弯下了一直挺直的腰板,眼泪鼻涕忽然倾泻而出,你————失声痛哭。全部的委屈从心里通过喉咙、鼻子、眼睛发泄出来,伴随着这一阵阵渐渐衰弱的回荡声,远去。
哭罢,擦干眼泪,平复下本身的心情,将那一段你追寻许久的答案缓慢但却有力的敲击出来:
callback(null, JSON.parse(body).showapi_res_body.f1.day_weather);
终于,这段代码就如同你家叛逆的孩子,脱去叛逆的假装,显现出它乖巧的样子:
通过这一次事件,你总结出三条经验:
总结完,你又用心的看着本身写下的代码,就如同看向本身的孩子,宠溺、疼爱、气愤各类心情夹杂在一块儿。忽然,你一皱眉,呵斥道:这样不对,异常的时候,也要返回!
因而,你纠正了代码的错误行为:
if (error || response.statusCode != 200) { console.log("error " + error); callback(error, null) ; }
就如同,训斥完与人打架的孩子,看到孩子听话了,你露出了欣慰的微笑。