溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

web開發(fā)怎么排查超時(shí)問題

發(fā)布時(shí)間:2021-12-22 14:00:26 來源:億速云 閱讀:230 作者:iii 欄目:web開發(fā)

這篇文章主要講解了“web開發(fā)怎么排查超時(shí)問題”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“web開發(fā)怎么排查超時(shí)問題”吧!

一氣呵成,bug 側(cè)漏

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);
    });
};

很簡(jiǎn)單的一個(gè) nodejs 函數(shù),剛剛接觸函數(shù)計(jì)算往往會(huì)意氣風(fēng)發(fā)的一口氣抒寫出這樣一段代碼,通常是為了簡(jiǎn)單測(cè)試一下函數(shù)的使用流程。但是發(fā)布到上去后,卻出現(xiàn)了調(diào)用超時(shí)的問題。

大膽猜測(cè),小心求證

首先,在無從下手的情況下,你大膽猜測(cè)如下:

  1. 函數(shù)入口寫錯(cuò)了

  2. 代碼中的邏輯有問題

  3. 函數(shù)計(jì)算服務(wù)有問題

為了排除其中的 3 選項(xiàng),首先通過 fun local,在本地運(yùn)行測(cè)試:

fun local invoke nodejs_timeout

得到結(jié)果:

web開發(fā)怎么排查超時(shí)問題

可以看到,程序也被卡在這里了。由此,可以排除掉 3 的可能性。

接著,可以通過加一些日志,或者單步調(diào)試來進(jìn)一步縮小排查的范圍,這里選用單步調(diào)試,因?yàn)檫@種方法往往更簡(jiǎn)單。

首先,利用 VSCode 在側(cè)邊欄下一個(gè)斷點(diǎn):

web開發(fā)怎么排查超時(shí)問題

然后使用以下命令將函數(shù)以調(diào)試的方式運(yùn)行起來(調(diào)試基本用法 參考 ,這里不再過多闡述):

fun local invoke -d 3000 nodejs_timeout

然后單擊 VSCode 的開始調(diào)試按鈕進(jìn)行調(diào)試:

web開發(fā)怎么排查超時(shí)問題

可以看到,函數(shù)被正確的調(diào)用了,且進(jìn)入到了入口函數(shù)。到此為止,可以排除掉 1 的可能性。

接下來,就要確認(rèn) 2 可能性中存在的問題。

在 request 處的代碼設(shè)置斷點(diǎn),continue 到里面,然后在 Local 可以看到運(yùn)行到此處時(shí)的變量的值。

web開發(fā)怎么排查超時(shí)問題

可以看到,http 請(qǐng)求返回的 resposne 的 statusCode 為 200,符合預(yù)期。body 也是有數(shù)據(jù)的,這個(gè)也符合預(yù)期。

body.weakday 放到 watch 里面執(zhí)行一下,看下結(jié)果。

web開發(fā)怎么排查超時(shí)問題

這個(gè)就不是預(yù)期中的值了。

仔細(xì)看下 body 這個(gè)對(duì)象,發(fā)現(xiàn)其顯示格式不對(duì),通過 typeof 將 body 的類型打印出來:

web開發(fā)怎么排查超時(shí)問題

這貨竟然是個(gè) string!

剛想破口大罵,但一想這代碼是自己寫的,趕緊閉嘴。

那就轉(zhuǎn)成 json 吧。

但轉(zhuǎn)完后,發(fā)現(xiàn)事情更不對(duì)了,day_weether 并不直接在 body 下,而是隱藏的很深。

web開發(fā)怎么排查超時(shí)問題

而且名字不叫 day_weether,這里有個(gè)拼寫錯(cuò)誤。正確的寫法應(yīng)該是:

JSON.parse(body).showapi_res_body.f1.day_weather

What the.... 臟話都到嘴邊了,但一想代碼自己寫的,總不能罵自己吧,趕緊修吧。

把正確的表達(dá)式貼到 Watch 里面,查看,果然能夠取到正確的值:

web開發(fā)怎么排查超時(shí)問題

驗(yàn)證完畢后,將正確的值粘貼到代碼中,心想,總算解決了。

重新運(yùn)行一下函數(shù),發(fā)現(xiàn)果然能夠取到數(shù)據(jù)了:

web開發(fā)怎么排查超時(shí)問題

但函數(shù)依舊卡在這里,并沒有繼續(xù)往下走————超時(shí)的問題依舊存在!

現(xiàn)在,憤怒的心情已經(jīng)沒有了,取而代之的是藍(lán)瘦,香菇。站起身,望望窗外,讓冷風(fēng)肆虐你的臉龐。許久,心里平靜一些了。

山窮水盡,柳暗花明

冷靜下來,理一理線索:

從剛才的調(diào)試結(jié)果來看,函數(shù)已經(jīng)運(yùn)行,且獲得了正確的結(jié)果,但是函數(shù)卻沒有結(jié)束,直到超時(shí)。突然,一個(gè)隱約的答案在你身邊徘徊,你拼命想要抓住,來回踱步,驀地,像是出現(xiàn)了救命稻草一般,打開了函數(shù)計(jì)算 Nodejs 的 文檔 ,你用盡力氣擺動(dòng)眼球,快速閱讀文檔,并在心里懇求那根救命稻草的出現(xiàn)?;腥婚g,你如同穿越了一道厚重的鐵門,身邊的光線突然由暗變亮,你被這明亮的光線刺的睜不開眼睛。但你知道,答案就在這刺眼的光芒里。眼淚,沒能止住,順著你的臉龐緩慢地流了下來。終于,你松開了緊握的拳頭,彎下了一直挺直的腰板,眼淚鼻涕突然傾瀉而出,你————失聲痛哭。所有的委屈從內(nèi)心經(jīng)過喉嚨、鼻子、眼睛發(fā)泄出來,伴隨著這一陣陣漸漸衰弱的回蕩聲,遠(yuǎn)去。

哭罷,擦干眼淚,平復(fù)下自己的心情,將那一段你追尋許久的答案緩慢但卻有力的敲擊出來:

callback(null, JSON.parse(body).showapi_res_body.f1.day_weather);

終于,這段代碼就如同你家叛逆的孩子,脫去叛逆的偽裝,顯現(xiàn)出它乖巧的樣子:

web開發(fā)怎么排查超時(shí)問題

欲善其事,先利其器

經(jīng)過這一次事件,你總結(jié)出三條經(jīng)驗(yàn):

  1. 寫代碼要耐心、細(xì)心,每一段代碼都要經(jīng)過思考。一口氣將功能寫完,往往是看上去寫的快,但實(shí)際上會(huì)埋很多坑,坑到別人還好,往往不小心會(huì)把自己坑了。

  2. 要多讀文檔。使用語言,要讀語言文檔,使用第三方庫,要讀庫的文檔,使用產(chǎn)品,要讀產(chǎn)品文檔。如果不仔細(xì)閱讀僅憑自己的猜測(cè)去寫,寫出的代碼往往漏洞百出。男人千萬不要硬撐,別對(duì)自己這么很。累了要休息,可以讀讀文檔放松下。俗話說得好,磨刀不誤砍柴工!

  3. Fun 工具的熟練使用重中之重。 在前兩點(diǎn)都沒做到的情況下,卻能最終將問題排查出來,F(xiàn)un 工具功不可沒!但與之功勞成反比的是,對(duì) Fun 工具的學(xué)習(xí)尤其是本地調(diào)試功能,花的時(shí)間反而是最少的,如此巨大的收益比,使自己下定決心,一定要再花些時(shí)間,把 Fun 工具 吃透!

總結(jié)完,你又用心的看著自己寫下的代碼,就如同看向自己的孩子,寵溺、疼愛、氣憤各種心情夾雜在一起。突然,你一皺眉,呵斥道:這樣不對(duì),異常的時(shí)候,也要返回!

于是,你糾正了代碼的錯(cuò)誤行為:

if (error || response.statusCode != 200) {    console.log("error " + error);
    callback(error, null) ;
}

感謝各位的閱讀,以上就是“web開發(fā)怎么排查超時(shí)問題”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)web開發(fā)怎么排查超時(shí)問題這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI