为什么Vue路由器中的错误在V8J中运行时每个都不会抛出异常?

问题描述 投票:0回答:1

我有一个使用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路由器中的未定义错误不会引发异常?

javascript php vue.js vue-router v8js
1个回答
0
投票

在路由器上使用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
}
© www.soinside.com 2019 - 2024. All rights reserved.