您好,登錄后才能下訂單哦!
這篇文章主要講解了“web開發怎么排查超時問題”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“web開發怎么排查超時問題”吧!
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 函數,剛剛接觸函數計算往往會意氣風發的一口氣抒寫出這樣一段代碼,通常是為了簡單測試一下函數的使用流程。但是發布到上去后,卻出現了調用超時的問題。
首先,在無從下手的情況下,你大膽猜測如下:
函數入口寫錯了
代碼中的邏輯有問題
函數計算服務有問題
為了排除其中的 3 選項,首先通過 fun local,在本地運行測試:
fun local invoke nodejs_timeout
得到結果:
可以看到,程序也被卡在這里了。由此,可以排除掉 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);
終于,這段代碼就如同你家叛逆的孩子,脫去叛逆的偽裝,顯現出它乖巧的樣子:
經過這一次事件,你總結出三條經驗:
寫代碼要耐心、細心,每一段代碼都要經過思考。一口氣將功能寫完,往往是看上去寫的快,但實際上會埋很多坑,坑到別人還好,往往不小心會把自己坑了。
要多讀文檔。使用語言,要讀語言文檔,使用第三方庫,要讀庫的文檔,使用產品,要讀產品文檔。如果不仔細閱讀僅憑自己的猜測去寫,寫出的代碼往往漏洞百出。男人千萬不要硬撐,別對自己這么很。累了要休息,可以讀讀文檔放松下。俗話說得好,磨刀不誤砍柴工!
Fun 工具的熟練使用重中之重。 在前兩點都沒做到的情況下,卻能最終將問題排查出來,Fun 工具功不可沒!但與之功勞成反比的是,對 Fun 工具的學習尤其是本地調試功能,花的時間反而是最少的,如此巨大的收益比,使自己下定決心,一定要再花些時間,把 Fun 工具 吃透!
總結完,你又用心的看著自己寫下的代碼,就如同看向自己的孩子,寵溺、疼愛、氣憤各種心情夾雜在一起。突然,你一皺眉,呵斥道:這樣不對,異常的時候,也要返回!
于是,你糾正了代碼的錯誤行為:
if (error || response.statusCode != 200) { console.log("error " + error); callback(error, null) ; }
感謝各位的閱讀,以上就是“web開發怎么排查超時問題”的內容了,經過本文的學習后,相信大家對web開發怎么排查超時問題這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。