From d469f38d988a488ecd739a9ef568b18ca08c4874 Mon Sep 17 00:00:00 2001 From: Johan Roxendal Date: Mon, 24 Apr 2017 22:21:11 +0200 Subject: [PATCH 1/2] Adds generate error report from renderer and minification. Changes the behavior where generate would terminate on error, now it instead gathers the error from crashing routes and compiles an error report. --- lib/generate.js | 25 ++++++++++++++++++++++--- lib/render.js | 16 ++++++++++++++-- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/lib/generate.js b/lib/generate.js index a080e89509..1c077bdd96 100644 --- a/lib/generate.js +++ b/lib/generate.js @@ -41,6 +41,7 @@ const defaults = { export default function () { const s = Date.now() + let errors = [] /* ** Set variables */ @@ -97,14 +98,26 @@ export default function () { yield routes.splice(0, 500).map((route) => { return co(function * () { yield waitFor(n++ * self.options.generate.interval) - var { html } = yield self.renderRoute(route, { _generate: true }) - html = minify(html, self.options.generate.minify) + var { html, error } = yield self.renderRoute(route, { _generate: true }) + // TODO: if error is truthy and html null, do continue + if(error) { + // console.log("error caught", error) + errors.push([route, error.errorObj]) + return + } + try { + var minifiedHtml = minify(html, self.options.generate.minify) + } catch(err) { + let minifyErr = new Error(`HTML minification failed. Make sure the route generates valid HTML. Failed HTML:\n ${html}`) + errors.push([route, minifyErr]) + return + } var path = join(route, sep, 'index.html') // /about -> /about/index.html debug('Generate file: ' + path) path = join(distPath, path) // Make sure the sub folders are created yield mkdirp(dirname(path)) - yield writeFile(path, html, 'utf8') + yield writeFile(path, minifiedHtml, 'utf8') }) }) } @@ -119,6 +132,12 @@ export default function () { .then(() => { const duration = Math.round((Date.now() - s) / 100) / 10 debug(`HTML Files generated in ${duration}s`) + + if(errors.length) { + console.error("==== Error report ==== \n" + errors.map( ([route, err]) => { + return `Route: '${route}'\n${err.stack}` + }).join("\n\n")) + } return this }) } diff --git a/lib/render.js b/lib/render.js index 5434d1c66d..8a12e602d4 100644 --- a/lib/render.js +++ b/lib/render.js @@ -96,7 +96,19 @@ export function renderRoute (url, context = {}) { // Call renderToSting from the bundleRenderer and generate the HTML (will update the context as well) const self = this return co(function * () { - let APP = yield self.renderToString(context) + try { + var APP = yield self.renderToString(context) + } catch(err) { + return { + html : null, + error : { + statusCode : 500, + message : err.message, + errorObj : err + }, + redirected: context.redirected + } + } if (!context.nuxt.serverRendered) { APP = '
' } @@ -168,4 +180,4 @@ export function renderAndGetWindow (url, opts = {}) { } }) }) -} +} \ No newline at end of file From 70f959ccb8e8524eb048815836797ae3aa0ae89c Mon Sep 17 00:00:00 2001 From: "johan.roxendal@gu.se" Date: Fri, 5 May 2017 11:30:30 +0200 Subject: [PATCH 2/2] rolled back changes to render, re-jiggled handling of errors in generate. --- lib/generate.js | 24 ++++++++++++++++-------- lib/render.js | 16 ++-------------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/lib/generate.js b/lib/generate.js index 1c077bdd96..b6f2827f7f 100644 --- a/lib/generate.js +++ b/lib/generate.js @@ -98,18 +98,21 @@ export default function () { yield routes.splice(0, 500).map((route) => { return co(function * () { yield waitFor(n++ * self.options.generate.interval) - var { html, error } = yield self.renderRoute(route, { _generate: true }) - // TODO: if error is truthy and html null, do continue - if(error) { - // console.log("error caught", error) - errors.push([route, error.errorObj]) + try { + var { html, error } = yield self.renderRoute(route, { _generate: true }) + if(error) { + errors.push({type : "handled", route, error}) + } + } catch(err) { + errors.push({type : "unhandled", route, error : err}) return + } try { var minifiedHtml = minify(html, self.options.generate.minify) } catch(err) { let minifyErr = new Error(`HTML minification failed. Make sure the route generates valid HTML. Failed HTML:\n ${html}`) - errors.push([route, minifyErr]) + errors.push({type : "unhandled", route, error : minifyErr}) return } var path = join(route, sep, 'index.html') // /about -> /about/index.html @@ -134,8 +137,13 @@ export default function () { debug(`HTML Files generated in ${duration}s`) if(errors.length) { - console.error("==== Error report ==== \n" + errors.map( ([route, err]) => { - return `Route: '${route}'\n${err.stack}` + console.error("==== Error report ==== \n" + errors.map( ({type, route, error}) => { + if(type == "unhandled") { + return `Route: '${route}'\n${error.stack}` + } else { + return `Route: '${route}' returned an error via context.error: \n` + + JSON.stringify(error) + } }).join("\n\n")) } return this diff --git a/lib/render.js b/lib/render.js index 8a12e602d4..5434d1c66d 100644 --- a/lib/render.js +++ b/lib/render.js @@ -96,19 +96,7 @@ export function renderRoute (url, context = {}) { // Call renderToSting from the bundleRenderer and generate the HTML (will update the context as well) const self = this return co(function * () { - try { - var APP = yield self.renderToString(context) - } catch(err) { - return { - html : null, - error : { - statusCode : 500, - message : err.message, - errorObj : err - }, - redirected: context.redirected - } - } + let APP = yield self.renderToString(context) if (!context.nuxt.serverRendered) { APP = '
' } @@ -180,4 +168,4 @@ export function renderAndGetWindow (url, opts = {}) { } }) }) -} \ No newline at end of file +}