From 3f7c5f64edb654d79bd7fb0bda5b1c9e50ceb9d7 Mon Sep 17 00:00:00 2001 From: Clark Du Date: Wed, 22 Aug 2018 14:10:43 +0100 Subject: [PATCH] fix: async fetch and asyncData not trigger ErrorHandler (#3781) --- lib/app/client.js | 11 +++-------- test/fixtures/spa/pages/error-handler-async.vue | 9 +++++++++ test/fixtures/spa/pages/error-handler.vue | 2 +- test/fixtures/spa/plugins/error.js | 4 ++-- test/unit/spa.test.js | 8 +++++++- 5 files changed, 22 insertions(+), 12 deletions(-) create mode 100644 test/fixtures/spa/pages/error-handler-async.vue diff --git a/lib/app/client.js b/lib/app/client.js index 6dc71d63b0..d210a0c24b 100644 --- a/lib/app/client.js +++ b/lib/app/client.js @@ -14,8 +14,7 @@ import { getLocation, compile, getQueryDiff, - globalHandleError, - empty + globalHandleError } from './utils' const noopData = () => { return {} } @@ -35,7 +34,7 @@ Object.assign(Vue.config, <%= serialize(vue.config) %>) <% if (debug || mode === 'spa') { %> // Setup global Vue error handler const defaultErrorHandler = Vue.config.errorHandler -Vue.config.errorHandler = (err, vm, info) => { +Vue.config.errorHandler = (err, vm, info, ...rest) => { const nuxtError = { statusCode: err.statusCode || err.name || 'Whoops!', message: err.message || err.toString() @@ -44,7 +43,7 @@ Vue.config.errorHandler = (err, vm, info) => { // Call other handler if exist let handled = null if (typeof defaultErrorHandler === 'function') { - handled = defaultErrorHandler(...arguments) + handled = defaultErrorHandler(err, vm, info, ...rest) } if (handled === true){ return handled @@ -347,8 +346,6 @@ async function render (to, from, next) { } <% } %> }) - // error will be handled in try catch - .catch(empty) promises.push(promise) } @@ -368,8 +365,6 @@ async function render (to, from, next) { } <% } %> }) - // error will be handled in try catch - .catch(empty) promises.push(p) } diff --git a/test/fixtures/spa/pages/error-handler-async.vue b/test/fixtures/spa/pages/error-handler-async.vue new file mode 100644 index 0000000000..48d7b0ef05 --- /dev/null +++ b/test/fixtures/spa/pages/error-handler-async.vue @@ -0,0 +1,9 @@ + diff --git a/test/fixtures/spa/pages/error-handler.vue b/test/fixtures/spa/pages/error-handler.vue index e9ef8ad2b0..179cffa74a 100644 --- a/test/fixtures/spa/pages/error-handler.vue +++ b/test/fixtures/spa/pages/error-handler.vue @@ -2,7 +2,7 @@ export default { fetch() { - throw Error('spa test error!') + throw Error('fetch error!') } } diff --git a/test/fixtures/spa/plugins/error.js b/test/fixtures/spa/plugins/error.js index 28875b1137..27bb917894 100644 --- a/test/fixtures/spa/plugins/error.js +++ b/test/fixtures/spa/plugins/error.js @@ -1,5 +1,5 @@ import Vue from 'vue' -Vue.config.errorHandler = function () { - document.body.appendChild(document.createTextNode('error handler triggered')) +Vue.config.errorHandler = function (err) { + document.body.appendChild(document.createTextNode(`error handler triggered: ${err.message}`)) } diff --git a/test/unit/spa.test.js b/test/unit/spa.test.js index 0773db02b8..f631535657 100644 --- a/test/unit/spa.test.js +++ b/test/unit/spa.test.js @@ -43,7 +43,13 @@ describe('spa', () => { test('/error-handler', async () => { await renderRoute('/error-handler') const { html } = await renderRoute('/error-handler') - expect(html).toMatch('error handler triggered') + expect(html).toMatch('error handler triggered: fetch error!') + }) + + test('/error-handler-async', async () => { + await renderRoute('/error-handler-async') + const { html } = await renderRoute('/error-handler-async') + expect(html).toMatch('error handler triggered: asyncData error!') }) test('/_nuxt/ (access publicPath in spa mode)', async () => {