From b6544637e094c47ad9d55f194921c83a61754ad5 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 20 Jun 2017 16:34:20 +0430 Subject: [PATCH] renderer: errorMiddleware Catch all middleware errors --- lib/core/nuxt.js | 2 +- lib/core/renderer.js | 46 ++++++++++++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/lib/core/nuxt.js b/lib/core/nuxt.js index f8da1adc69..6d56f5c8fe 100644 --- a/lib/core/nuxt.js +++ b/lib/core/nuxt.js @@ -22,7 +22,7 @@ export default class Nuxt extends Tapable { this.renderer = new Renderer(this) // Backward compatibility - this.render = (...args) => this.renderer.app(...args) + this.render = this.renderer.app this.renderRoute = this.renderer.renderRoute.bind(this.renderer) this.renderAndGetWindow = this.renderer.renderAndGetWindow.bind(this.renderer) diff --git a/lib/core/renderer.js b/lib/core/renderer.js index d6352d738d..c54820eb82 100644 --- a/lib/core/renderer.js +++ b/lib/core/renderer.js @@ -45,6 +45,10 @@ export default class Renderer extends Tapable { errorTemplate: parseTemplate('
{{ stack }}
') // Will be loaded on ready } + // Bind middleware to this context + this.nuxtMiddleware = this.nuxtMiddleware.bind(this) + this.errorMiddleware = this.errorMiddleware.bind(this) + // Initialize /* istanbul ignore if */ if (nuxt.initialized) { @@ -220,10 +224,13 @@ export default class Renderer extends Tapable { } // Finally use nuxtMiddleware - this.useMiddleware(this.nuxtMiddleware.bind(this)) + this.useMiddleware(this.nuxtMiddleware) + + // Error middleware for errors that occurred in middleware that declared above + this.useMiddleware(this.errorMiddleware) } - async nuxtMiddleware (req, res) { + async nuxtMiddleware (req, res, next) { // Get context const context = getContext(req, res) res.statusCode = 200 @@ -271,23 +278,28 @@ export default class Renderer extends Tapable { res.end(html, 'utf8') return html } catch (err) { - /* istanbul ignore if */ - if (context.redirected) { - console.error(err) // eslint-disable-line no-console - return err - } - // Render error template - const html = this.resources.errorTemplate({ - error: err, - stack: ansiHTML(encodeHtml(err.stack)) - }) - // Send response - res.statusCode = 500 - res.setHeader('Content-Type', 'text/html; charset=utf-8') - res.setHeader('Content-Length', Buffer.byteLength(html)) - res.end(html, 'utf8') + next(this.errorMiddleware(err, req, res, next, context)) + } + } + + async errorMiddleware (err, req, res, next, context) { + /* istanbul ignore if */ + if (context && context.redirected) { + console.error(err) // eslint-disable-line no-console return err } + + // Render error template + const html = this.resources.errorTemplate({ + error: err, + stack: ansiHTML(encodeHtml(err.stack)) + }) + // Send response + res.statusCode = 500 + res.setHeader('Content-Type', 'text/html; charset=utf-8') + res.setHeader('Content-Length', Buffer.byteLength(html)) + res.end(html, 'utf8') + return err } async renderRoute (url, context = {}) {