垂死病中驚坐起,笑問 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,就能正確傳遞了。
數據綁定不能用大寫,記住啊,兄die。(或者可以用大寫綁定,小寫獲取,開心就好呀)
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 天,我會努力爬上來更新的,點擊下方「寫留言」一起討論呀,分享、討論纔是更好的學習方式,搖起來。
本文首發於公衆號「我是玖柒後」,一起來踩坑吧!