我有一个使用SSR的Laravel / Vue应用程序,所以JavaScript在服务器端和客户端运行。
我的代码中有一个错误,当用户对象为null时,我正在检查user.id
。
如果这已经在客户端运行,我会在控制台中看到该错误并轻松修复它。
但是因为它是在v8js中运行的,所以我完全没有输出,只是通过反复试验来查找和修复错误的情况。这使我想起了在IE6中修复JS错误的方法-不想重复!
[我确实尝试过getPendingException()
方法,但这只是警告我不赞成使用它。
注意,会产生一些错误。...
运行Webpack时立即发现明显的语法错误。
某些错误引发V8JsScriptException:
getPendingException()
这会产生错误:
if(foo.bar) {}
如果我在函数中包装foo,然后调用它:
V8Js::compileString():86354: ReferenceError: foo is not defined
没有引发异常,但是返回的唯一输出是:
function test() {
if(foo.bar) {}
}
test()
但是,用于我的Vue路由器的此代码完全不产生任何输出:
ReferenceError: foo is not defined
当我在浏览器中运行相同的代码时,控制台显示:
import Vue from 'vue'
import Router from 'vue-router'
import routes from './routes'
Vue.use(Router)
export function createRouter () {
const router = new Router({
mode: 'history',
routes: routes
})
router.beforeEach(async (to, from, next) => {
if(foo.bar) {}
next()
})
return router
}
所以看来JS正在创建错误-但V8J某种程度上没有将其传递给您。
为什么在v8js中运行Vue路由器中的未定义错误不会引发异常?
在路由器上使用onError处理程序:ReferenceError: foo is not defined
而且,由于您的router.onError保护是异步的,因此您需要调用beforeEnter
并出现错误:
next
对于您的示例,您可以使用同步保护,而无需使用try / catch:
export function createRouter () {
const router = new Router({
mode: 'history',
routes: routes
})
router.beforeEach(async (to, from, next) => {
try {
if(foo.bar) {}
next()
} catch (e) {
next(e)
}
})
router.onError(err => {
print('<!-- router error: ' + err.message + ' -->')
})
return router
}