垂死病中驚坐起,笑問 Bug 何處來?!
1、先是大寫字母作祟
前兩天發布了「柒留言」v2.0.0 新版本,結果...你懂的嘛,沒有 Bug 的程序不是好程序,寫不出 Bug 的程序員不是好程序員。
那個,有一兩個小 Bug 很正常的啦。
有用戶反饋,收到了留言回復的通知,但是點進去沒有內容。怎么會有 Bug 呢?肯定是你用的方法不對。
下班回到家的我立馬打開開發者工具,一測試發現,果然,我是不可能寫不出 Bug 的。
寫 Bug 是一把好手,找 Bug 我也是不賴的,最后原因定位:參數沒有正確傳遞。
A 頁面 // a.wxml <view data-testID="test" data-openid="msunh" bindtap="toB">B</view> // a.js toB(e) { var i = e.currentTarget.dataset; wx.navigateTo({ url: '/pages/b?testID=' + i.testID + '&openid=' + i.openid, }) console.log(i) } B 頁面 // b.js onLoad: function (options) { this.setData({ testID: options.testID, openid: options.openid }) }
結果是:
很明顯,openid 獲得了正確參數,說明接收和傳遞過程毛問題,那就是傳遞之前 testID 就出錯了。
控制台打印一下 dataset,發現沒有, testID 變成了 testid。
這說明了什么?說明他在搞事情,他在搞我!這里把 testID 改成 testid,就能正確傳遞了。
2、連一個 ? 都敢搞我?
改完 Bug 想着可以休息會,結果大半夜又有人找:回復讀者失敗了。
我試了一下,沒發現他說的問題。便回復道:刷新一下?多試兩次?換個網絡?應該不是我這邊的問題吧...
過了一會,這個老哥說還是不行,然后這個老哥大半夜還和我一起來找 Bug 了,感動,找到 Bug 我還特地發了個紅包感謝。
最后發現數據在一個問號那里斷開了,前面數據正常,后面數據被截斷。仔細看下是因為用戶輸入了一個英文「?」??????
A 頁面 // a.wxml <view data-hello="你最近怎么樣?我很好" bindtap="toB">toB</view> // a.js toB(e) { var i = e.currentTarget.dataset; wx.navigateTo({ url: '/pages/b?hello=' + i.hello, }) } B 頁面 // b.js onLoad: function (options) { this.setData({ hello: options.hello, }) }
結果 AppData 中是這樣的:
果然是英文問號惹的麻煩,腦殼疼,連個「?」都來找麻煩,我好南南南南南南啊。
3、盤他
找到問題了就盤他,但這不能怪用戶,鬼知道什么時候就輸入了一個「?」。因為跳轉路徑中加參數也是用的「?」,所以這里應該是被誤「?」后面帶參。
最后我想了兩種方法,這里供大家參考一下,如果有更好的方法,歡迎留言一起討論。
I. 跳轉頁面的時候把 dataset 的數據寫入緩存,到了新頁面再讀取緩存,這里就不啰嗦了,關鍵是第二種。
II. 利用 replace 把 ? 轉化成 ?
但是這里有個問題,用 replace('?', '?') 的話,只能轉化一次。
如果輸入了多個英文問號呢?不排除這種可能,所以不建議用 replace('?', '?') ,推薦加入正則表達式,即 replace(/\?/g, "?") 去轉化英文問號。
4、最后
柒塊腹肌的玖柒回來了,有段時間沒更新了,一直在忙着重寫小程序,主要是我還沒有想到更好的借口。
今年還有 101 天,我會努力爬上來更新的,點擊下方「寫留言」一起討論呀,分享、討論才是更好的學習方式,搖起來。
本文首發於公眾號「我是玖柒后」,一起來踩坑吧!