有時候我們會通過mongo shell 運行一些腳本,去執行更新或運維需求。mongo shell 可執行的代碼可以實現比較複雜的功能,代碼也可以比較豐富。當執行報錯時,如果可以快速定位到錯誤點,對解決bug, 可以事半功倍。 我們先測試一下: Case 1 簡單的向集合中插入一筆數據 執行代碼: ...
有時候我們會通過mongo shell 運行一些腳本,去執行更新或運維需求。mongo shell 可執行的代碼可以實現比較複雜的功能,代碼也可以比較豐富。當執行報錯時,如果可以快速定位到錯誤點,對解決bug, 可以事半功倍。
我們先測試一下:
Case 1 簡單的向集合中插入一筆數據
執行代碼:
db.testdecimal.insert({“val”: NumberDecimal( “9.99” )})
報錯信息:
2018-08-16T14:04:51.349+0800 E QUERY [js] SyntaxError: illegal character @(shell):1:23
Case 2 將上面的代碼包在一個 for 迴圈中
執行代碼:
for (var i =0; i<5; i++){db.testdecimal.insert({“val”: NumberDecimal( “9.99” )})}
報錯信息:
2018-08-16T14:06:00.900+0800 E QUERY [js] SyntaxError: illegal character @(shell):1:48
Case 3 將Case中的代碼換成兩行
for (var i =0; ... i<5; i++){db.testdecimal.insert({“val”: NumberDecimal( “9.99” )})}
報錯信息
2018-08-16T14:08:54.577+0800 E QUERY [js] SyntaxError: illegal character @(shell):2:33
經過排錯定位,錯誤為 “val” 中的“”是中文雙引號。將至更新為英文。
Case 4
for (var i =0; i<5; i++){db.testdecimal.insert({"val": NumberDecimal( “9.99” )})}
報錯信息:
2018-08-16T14:30:29.110+0800 E QUERY [js] SyntaxError: illegal character @(shell):1:70
再次排查,錯誤為 “9.99” 中的“”是中文雙引號。將至更新為英文。
Case 5
for (var i =0; i<5; i++){db.testdecimal.insert({"val": NumberDecimal( "9.99" )})}
執行OK:
WriteResult({ "nInserted" : 1 })
我們回頭,再仔細看下。錯誤信息中最後的數字信息(紅色標註)。
1:23 ; 1:48 ; 2:33 ; 1:70 。
其實這些數字,已經標註了,錯誤位於第幾行,第幾個字元。:(冒號)前,代表錯誤位於的行數;:(冒號)後,代表錯誤位於本行第幾個字元。
但需要留意,這是在錯誤類型為 SyntaxError 情況下成立的。SyntaxError :代表嘗試解析語法上不合法的代碼的錯誤。當Javascript語言解析代碼時,Javascript引擎發現了不符合語法規範的tokens或token順序時拋出SyntaxError。
如果我們用一個未定義的函數或是函數名寫錯了或是什麼樣子呢?
Case 6
執行代碼:
db.testdecimal.find().preetty()
錯誤信息:
2018-08-16T15:11:37.501+0800 E QUERY [js] TypeError: db.testdecimal.find(...).preetty is not a function : @(shell):1:1
如需將錯誤代碼嵌套到其他語句中呢?
Case 7
執行代碼:
for (var i =0; i<5; i++){db.testdecimal.find().preetty()}
錯誤信息:
2018-08-16T15:14:37.532+0800 E QUERY [js] TypeError: db.testdecimal.find(...).preetty is not a function : @(shell):2:11
mongo 沒有
preetty()函數,只有 pretty()方法,它的作用是 使得查詢出來的數據在命令行中更加美觀的顯示,不至於太緊湊。
我們看到此類的錯誤類型是 TypeError,用來表示值的類型非預期類型時發生的錯誤。當傳入函數的操作數或參數的類型並非操作符或函數所預期的類型時,將拋出一個 TypeError 類型錯誤。
此類錯誤,拋出的數字,第一個還是錯誤所在的行數,而第二個就不是了,它是把後面的功能實現當成了一個點。
一句話總結:解決bug時,充分重視返回的錯誤信息。
本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!