为啥在 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 命令?