为啥在 V8Js 中运行时,Vue 路由器 beforeEach 中的错误不会抛出异常?

Posted

技术标签:

【中文标题】为啥在 V8Js 中运行时,Vue 路由器 beforeEach 中的错误不会抛出异常?【英文标题】:Why do errors in Vue router beforeEach throw no exception when running in V8Js?为什么在 V8Js 中运行时,Vue 路由器 beforeEach 中的错误不会抛出异常? 【发布时间】:2020-09-14 14:42:41 【问题描述】:

我有一个使用 s-s-r 的 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为什么不抛出异常?

【问题讨论】:

从未使用过 v8js,但从文档看来,它似乎将您的代码包装在 V8JsException 中,如果发生错误,捕获它可能会为您提供线索。 Here's 也是一个简短的教程,提到了捕获异常。 有时会抛出 V8JsException - 但有时不会。我更新了我的问题以更深入地描述问题。 【参考方案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()
)

【讨论】:

这个逻辑似乎完美无缺——但它实际上并没有为我产生任何输出。但是,我仍会将其保留在我的代码中,以防万一它捡起任何东西。 我有类似的情况,renderVueComponentToString 返回一个空字符串并且没有抛出异常。对我来说,它发生在具有特定 vue-apollo 智能查询的组件上。它在客户端上正常工作,但似乎在 s-s-r 期间爆炸。我追踪到 vue-server-renderer-basic.js 但无法将调试器连接到 v8js,我也无法弄清楚。我确实用onError 处理程序和onError 处理程序为我选择了未定义变量foo 的示例。造成这种情况的原因非常模糊。 @FelixEve - 重建 v8 和 v8js(我分别使用了 8.5.77 和 2.1.1 版本)为我解决了这个问题。

以上是关于为啥在 V8Js 中运行时,Vue 路由器 beforeEach 中的错误不会抛出异常?的主要内容,如果未能解决你的问题,请参考以下文章

当程序在 IntelliJ 中运行时,为啥我会收到 SSLHandshakeException 作为 JAR?

为啥实体框架在不同的 AppDomain 中运行时会明显变慢?

为啥在火花中运行时配置单元查询不起作用

当命令在 Ubuntu 终端中运行时,为啥 Dart 的“Process.start”不能执行 Ubuntu 命令?

为啥我的图像出现在 Android Studio 设计视图中,但在手机中运行时却没有?

为啥'get_json_object'在spark和sql工具中运行时返回不同的结果