[ https://issues.apache.org/jira/browse/THRIFT-5674?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17695359#comment-17695359 ]
Jens Geyer commented on THRIFT-5674: ------------------------------------ > _[1] There also seems to be a couple of errors in NodeClientPromise.js in >the tutorial code. I had to change "fail" to "catch" and "fin" to "finally" >to get it to work._ That most likely probably relates to [https://www.npmjs.com/package/q |https://www.npmjs.com/package/q] - since their recommendation on that page is to switch to catch/finally, that change seems fine to me. > Server implementation exceptions are not sent to client in ES6 promise-style > invocation > --------------------------------------------------------------------------------------- > > Key: THRIFT-5674 > URL: https://issues.apache.org/jira/browse/THRIFT-5674 > Project: Thrift > Issue Type: Bug > Components: JavaScript - Compiler > Affects Versions: 0.17.0 > Environment: Discovered on Node.js v16.13.2, Thrift 0.17.0 compiler, > 0.16.0 library. > Reproduced on Node.js v10.19.0, Thrift 0.17.0 compiler, 0.17.0 library (just > what I happened to have available for trying out the tutorial code). > Reporter: Chandler May > Priority: Major > Original Estimate: 3h > Time Spent: 10m > Remaining Estimate: 2h 50m > > When a server implementation throws a user-defined exception, the server > crashes and the exception is not sent to the client. I believe this issue > only happens in the Promise-style invocation of code generated for ES6. > Specifically, I think it arises from this line: > [https://github.com/apache/thrift/blob/0.17.0/compiler/cpp/src/thrift/generate/t_js_generator.cc#L1484] > Generated code looks like the following (generated from the > Calculator.calculate example): > {code:java} > Promise.resolve(this._handler.calculate.bind(this._handler)( > args.logid, > args.w > )).then( > ... > ).catch(err => { > if (err instanceof ttypes.InvalidOperation) { > ... > } > );{code} > The implementation-generated exception is handled by the promise chain. The > problem is that the implementation (handler) method is called _before_ > Promise.resolve, so any exception it throws is not handled by the promise > chain. So, when running{^}1{^} NodeServerPromise.js and NodeClientPromise.js > from the tutorial, the server crashes when InvalidOperation is thrown and the > client does not receive InvalidOperation (or anything further). > I think the minimal fix would be to generate something like the following > instead: > {code:java} > new Promise((resolve) => resolve(this._handler.calculate.bind(this._handler)( > args.logid, > args.w > ))).then( > ... > ).catch(err => { > if (err instanceof ttypes.InvalidOperation) { > ... > } > );{code} > When making this change on the generated tutorial code and re-running{^}1{^} > the server and client, the server stays up and both the server and client log > five lines, as expected. > _[1] There also seems to be a couple of errors in NodeClientPromise.js in the > tutorial code. I had to change "fail" to "catch" and "fin" to "finally" to > get it to work._ -- This message was sent by Atlassian Jira (v8.20.10#820010)