On 11 June 2017 at 00:14, Sam Ruby <ru...@intertwingly.net> wrote: > On Sat, Jun 10, 2017 at 6:39 PM, sebb <seb...@gmail.com> wrote: >> On 10 June 2017 at 23:20, Sam Ruby <ru...@intertwingly.net> wrote: >>> On Sat, Jun 10, 2017 at 6:15 PM, sebb <seb...@gmail.com> wrote: >>>> On 10 June 2017 at 17:22, Sam Ruby <ru...@intertwingly.net> wrote: >>>>> On Sat, Jun 10, 2017 at 12:05 PM, sebb <seb...@gmail.com> wrote: >>>>>> On 10 June 2017 at 16:58, Sam Ruby <ru...@intertwingly.net> wrote: >>>>>>> On Sat, Jun 10, 2017 at 11:48 AM, sebb <seb...@gmail.com> wrote: >>>>>>>> On 10 June 2017 at 15:57, Sam Ruby <ru...@intertwingly.net> wrote: >>>>>>>>> On Sat, Jun 10, 2017 at 10:27 AM, sebb <seb...@gmail.com> wrote: >>>>>>>>>> On 10 June 2017 at 15:20, Sam Ruby <ru...@intertwingly.net> wrote: >>>>>>>>>>> On Sat, Jun 10, 2017 at 9:43 AM, sebb <seb...@gmail.com> wrote: >>>>>>>>>>>> Hard to trace entry in error.log: >>>>>>>>>>>> >>>>>>>>>>>> App 11526 stderr: _ERROR TypeError: Cannot read property >>>>>>>>>>>> 'proposal' of null >>>>>>>>>>>> >>>>>>>>>>>> The above error was fixed by cf054fd >>>>>>>>>>>> >>>>>>>>>>>> However finding the location of the error is not trivial, as there >>>>>>>>>>>> is >>>>>>>>>>>> no obvious context. >>>>>>>>>>>> >>>>>>>>>>>> Most other Ruby errors are reported with a stack trace and line >>>>>>>>>>>> numbers - why is this error different? >>>>>>>>>>>> Can it be fixed to produce a more detailed error message? >>>>>>>>>>> >>>>>>>>>>> It is different in that it actually is a JavaScript error. >>>>>>>>>>> >>>>>>>>>>> A number of whimsy applications use react.js in a number of pages >>>>>>>>>>> (many roster pages, all board agenda pages). If you view source on >>>>>>>>>>> those pages, you will see a static rendering, then the loading of >>>>>>>>>>> javascript files, then the data the scripts need. >>>>>>>>>>> >>>>>>>>>>> The static rendering is done by running the JavaScript application >>>>>>>>>>> on >>>>>>>>>>> the server and inserting its output into the page. That application >>>>>>>>>>> may fail, which is what happened here. >>>>>>>>>> >>>>>>>>>> Can't such errors be caught by the code that runs JavaScript? >>>>>>>>> >>>>>>>>> I suspect that that would either require a change to ExecJS or for >>>>>>>>> Wunderbar to use an alternative to ExecJS. Here is the relevant >>>>>>>>> Wunderbar code: >>>>>>>>> >>>>>>>>> https://github.com/rubys/wunderbar/blob/master/lib/wunderbar/react.rb#L125 >>>>>>>> >>>>>>>> There's a rescue clause here: >>>>>>>> >>>>>>>> https://github.com/rubys/wunderbar/blob/master/lib/wunderbar/react.rb#L133 >>>>>>>> >>>>>>>> Is that catching all possible errors, or are some not catchable here? >>>>>>> >>>>>>> It is catching the error, and printing out the one line you are >>>>>>> seeing. What is missing is anything resembling a stack traceback - >>>>>>> which I presumed was the context you were originally looking for (see >>>>>>> subject line?). >>>>>> >>>>>> Yes. >>>>>> >>>>>> If Wunderbar has control over what is printed, then surely it can add >>>>>> some more context? >>>>>> Eg the name of the file it is processing? >>>>> >>>>> I'm still not following. >>>>> >>>>> In the case of the Roster tool, here's the input: >>>>> >>>>> https://github.com/apache/whimsy/blob/master/www/roster/views/ppmc.html.rb >>>> >>>> This is not obvious from the error log >>>> >>>>> So, the name of the file being processed is 'app.js'. Here it is: >>>>> >>>>> https://github.com/apache/whimsy/blob/master/www/roster/views/app.js.rb >>>>> >>>>> Here's the generated javascript, which is run on both the client and >>>>> server: >>>>> >>>>> https://whimsy.apache.org/roster/app.js >>>>> >>>>> The error you saw occurred some place in that generated file. >>>>> >>>>> It is not clear to me how logging the name 'app.js' would help with >>>>> debugging. >>>>> >>>>> Knowing the page that failed would be more useful, but that already is >>>>> in the log. >>>> >>>> Is it? >>>> >>>> A sample log extract shows: >>>> >>>> App 11526 stderr: 71.168.148.85 - johndament [10/Jun/2017:12:35:34 >>>> +0000] "GET / HTTP/1.1" 304 - 1.6687 >>>> App 11526 stderr: 71.168.148.85 - johndament [10/Jun/2017:12:35:36 >>>> +0000] "GET /ppmc/ HTTP/1.1" 200 - 0.1865 >>>> App 11526 stderr: _ERROR TypeError: Cannot read property 'proposal' of null >>>> App 11526 stderr: 71.168.148.85 - johndament [10/Jun/2017:12:35:40 >>>> +0000] "GET /ppmc/ariatosca HTTP/1.1" 200 - 1.8059 >>>> App 11526 stderr: 71.168.148.85 - johndament [10/Jun/2017:12:35:40 >>>> +0000] "GET /app.js HTTP/1.1" 200 - 0.0036 >>>> App 11526 stderr: 71.168.148.85 - johndament [10/Jun/2017:12:54:49 >>>> +0000] "GET / HTTP/1.1" 304 - 1.3152 >>>> App 11526 stderr: 71.168.148.85 - johndament [10/Jun/2017:12:54:53 >>>> +0000] "GET /ppmc/ HTTP/1.1" 304 - 0.1825 >>>> App 11526 stderr: _ERROR TypeError: Cannot read property 'proposal' of null >>>> App 11526 stderr: 71.168.148.85 - johndament [10/Jun/2017:12:54:55 >>>> +0000] "GET /ppmc/ariatosca HTTP/1.1" 304 - 1.0298 >>>> App 11526 stderr: 71.168.148.85 - johndament [10/Jun/2017:12:54:56 >>>> +0000] "GET /app.js HTTP/1.1" 304 - 0.0004 >>>> App 11526 stderr: _ERROR TypeError: Cannot read property 'proposal' of null >>>> App 11526 stderr: 98.122.169.124 - rubys [10/Jun/2017:13:02:40 +0000] >>>> "GET /ppmc/atlas HTTP/1.1" 200 - 0.5462 >>>> App 11526 stderr: 98.122.169.124 - rubys [10/Jun/2017:13:02:41 +0000] >>>> "GET /stylesheets/app.css HTTP/1.1" 200 - 0.0007 >>>> App 11526 stderr: 98.122.169.124 - rubys [10/Jun/2017:13:02:41 +0000] >>>> "GET /app.js HTTP/1.1" 200 - 0.0032 >>>> >>>> It's not at all obvious how to debug that, except that it is probably >>>> associated with the /ppmc/ URL >>>> >>>> There's no indication that the error is a Javascript error. >>>> Nor how to find the script that generated the Javascript >>>> >>>> When I tried forcing an error, the Javascript console shows: >>>> >>>> Uncaught TypeError: Cannot read property 'length' of undefined >>>> at main.js.rb:144 >>>> .... >>>> >>>> But the screen only shows 'TypeError: Cannot read property 'length' of >>>> undefined' >>>> >>>> and the log likewise. >>>> >>>> I would expect the log (and possibly the screen) to show the first >>>> part of the stack trace. >>> >>> As I said, I know of no way to get any more information out of ExecJS. >>> If you know of a way to get more information out, or know of a viable >>> alternative to, ExecJS, please educate me. >> >> I don't know where to start with ExecJS. > > Neither do I. > >> But it ought to be possible to use window.onerror or similar in the >> generated code to catch/display the error to the user. > > There is no window object on the server. > >> Or wrap the generated JS in try/catch. > > And do what?
Display err.stack for example: try { ... } catch(err) { alert(err.stack); console.log(err.stack); etc. } However I've no idea how to add that to the generated code. It might be worth seeing what the following gives: rescue ExecJS::ProgramError => e Wunderbar.error e.inspect It may be that the error object has more info embedded. > I encourage you to experiment. > > I'd like to do better. I just don't know how. > > - Sam Ruby > >>> - Sam Ruby >>> >>>>>>> Or am I misunderstanding what you are looking for? >>>>>>> >>>>>>>>>>> Generally, the easiest way to debug such situations is to bring the >>>>>>>>>>> page up in the browser and look at the error console. It used to be >>>>>>>>>>> the case that in both Firefox and Chrome, you could click on the >>>>>>>>>>> stack >>>>>>>>>>> traceback in the console to see the original source; but for >>>>>>>>>>> reasons I >>>>>>>>>>> don't understand, with the current FIrefox you see the generated >>>>>>>>>>> JavaScript instead. >>>>>>>>>>> >>>>>>>>>>> - Sam Ruby >>>>>>>>> >>>>>>>>> - Sam Ruby >>>>>>> >>>>>>> - Sam Ruby