1

我有一个使用 SSR 的 Laravel / Vue 应用程序,所以让 JavaScript 运行服务器端和客户端。

我的代码中有一个错误,我正在检查user.id用户对象何时为空。

如果这一直在客户端运行,我会在控制台中看到错误并轻松修复它。

然而,因为这是在v8js中运行的,所以我根本没有得到任何输出,只是为了定位和修复错误而反复试验。这让我想起了修复 IE6 中的 JS 错误——我不想重复!

我确实尝试了该getPendingException()方法,但这只是给了我一个关于它已被弃用的警告。

注意会产生一些错误......

当我运行 webpack 时,会立即发现明显的语法错误。

一些错误会引发 V8JsScriptException:

if(foo.bar) {}

这会产生错误:

V8Js::compileString():86354: ReferenceError: foo is not defined

如果我将 foo 包装在一个函数中然后调用它:

function test() {
    if(foo.bar) {}
}
test()

没有抛出异常,但返回的唯一输出是:

ReferenceError: foo is not defined 

然而,这段用于我的 Vue 路由器的代码根本不产生任何输出:

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
}

当我在浏览器中运行相同的代码时,控制台显示:

ReferenceError: foo is not defined

所以看起来 JS 正在创建一个错误 - 但不知何故 V8Js 并没有传递它。

为什么v8js中运行时vue router中的undefined error不抛出异常?

4

1 回答 1

1

在路由器上使用 onError 处理程序:router.onError

而且,由于你的beforeEnter警卫是异步的,你需要调用next错误:

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
}

对于您的示例,您可以使用同步保护并且不使用 try/catch:

router.beforeEach((to, from, next) => {
    if(foo.bar) {}
    next()
})
于 2020-06-04T16:23:56.660 回答