mongo shell 通过返回信息定位错误点
有时候我们会通过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时,充分重视返回的错误信息。
本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!