From fa1d06268d7784960f89dea916bcb9e8000d8c7f Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Mon, 15 Sep 2014 09:22:23 -0700 Subject: [PATCH] raise any JS error when prerendering --- lib/react/renderer.rb | 14 ++++++++------ test/react_renderer_test.rb | 8 ++++++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/react/renderer.rb b/lib/react/renderer.rb index bc60c0868..6b137a457 100644 --- a/lib/react/renderer.rb +++ b/lib/react/renderer.rb @@ -3,6 +3,13 @@ module React class Renderer + class PrerenderError < RuntimeError + def initialize(component_name, props, js_message) + message = "Encountered error \"#{js_message}\" when prerendering #{component_name} with #{props.to_json}" + super(message) + end + end + cattr_accessor :pool def self.setup!(react_js, components_js, args={}) @@ -56,13 +63,8 @@ def render(component, args={}) }() JS context.eval(jscode).html_safe - # What should be done here? If we are server rendering, and encounter an error in the JS code, - # then log it and continue, which will just render the react ujs tag, and when the browser tries - # to render the component it will most likely encounter the same error and throw to the browser - # console for a better debugging experience. rescue ExecJS::ProgramError => e - ::Rails.logger.error "[React::Renderer] #{e.message}" + raise PrerenderError.new(component, args, e) end - end end diff --git a/test/react_renderer_test.rb b/test/react_renderer_test.rb index 7e2dab90e..94282fc92 100644 --- a/test/react_renderer_test.rb +++ b/test/react_renderer_test.rb @@ -15,4 +15,12 @@ class ReactRendererTest < ActiveSupport::TestCase end end end + + test 'prerender errors are thrown' do + err = assert_raises React::Renderer::PrerenderError do + React::Renderer.render("NonexistentComponent", {error: true, exists: false}) + end + expected_message = 'Encountered error "ReferenceError: NonexistentComponent is not defined" when prerendering NonexistentComponent with {"error":true,"exists":false}' + assert_equal expected_message, err.message + end end