From cfd6b197c4009274c43ea6a82dec82a9fdd128a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= Date: Fri, 24 Mar 2017 01:28:19 +0100 Subject: [PATCH] Improve error handling on SSR --- lib/app/server.js | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/lib/app/server.js b/lib/app/server.js index 1c03a41071..62ac0f24d5 100644 --- a/lib/app/server.js +++ b/lib/app/server.js @@ -8,7 +8,7 @@ import { stringify } from 'querystring' import { omit } from 'lodash' import middleware from './middleware' import { app, router<%= (store ? ', store' : '') %>, NuxtError } from './index' -import { getContext, promiseSeries, promisify, urlJoin } from './utils' +import { getMatchedComponents, getContext, promiseSeries, promisify, urlJoin } from './utils' const isDev = <%= isDev %> const _app = new Vue(app) @@ -40,8 +40,6 @@ export default context => { }) context.res.end() } - // set router's location - router.push(context.url) // Add route to the context context.route = router.currentRoute // Add meta infos @@ -52,12 +50,26 @@ export default context => { <%= (isDev ? 'const s = isDev && Date.now()' : '') %> let ctx = getContext(context) let Components = [] - return new Promise((resolve) => { - // Wait for the lazy-routes are loaded - router.onReady(resolve) + let promises = getMatchedComponents(router.match(context.url)).map((Component) => { + return new Promise((resolve, reject) => { + const _resolve = (Component) => { + if (!Component.options) { + Component = Vue.extend(Component) // fix issue #6 + Component._Ctor = Component + } else { + Component._Ctor = Component + Component.extendOptions = Component.options + } + resolve(Component) + } + Component().then(_resolve).catch(reject) + }) }) - .then(() => { - Components = router.getMatchedComponents() + return Promise.all(promises) + .then((_Components) => { + Components = _Components + // set router's location + router.push(context.url) // nuxtServerInit <% if (store) { %> let promise = (store._actions && store._actions.nuxtServerInit ? store.dispatch('nuxtServerInit', omit(getContext(context), 'redirect', 'error')) : null) @@ -186,8 +198,7 @@ export default context => { }) .catch(function (error) { if (error && (error instanceof Error || error.constructor.toString().indexOf('Error()') !== -1)) { - let statusCode = error.statusCode || error.status || (error.response && error.response.status) || 500 - error = { statusCode, message: error.message } + return Promise.reject(error) } else if (typeof error === 'string') { error = { statusCode: 500, message: error }