This is an automated email from the ASF dual-hosted git repository.
jamesthomas pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/incubator-openwhisk-runtime-nodejs.git
The following commit(s) were added to refs/heads/master by this push:
new 3ede534 Fixes #63 - Support errors thrown from async functions (#95)
3ede534 is described below
commit 3ede5341afed18e617140de243a0c8050293f74a
Author: James Thomas <[email protected]>
AuthorDate: Mon Oct 29 14:19:07 2018 +0000
Fixes #63 - Support errors thrown from async functions (#95)
Return error string from errors and log stack trace for rejected promises.
---
core/nodejsActionBase/runner.js | 6 +++-
.../NodeJs8ActionContainerTests.scala | 40 ++++++++++++++++++++++
2 files changed, 45 insertions(+), 1 deletion(-)
diff --git a/core/nodejsActionBase/runner.js b/core/nodejsActionBase/runner.js
index ea869be..1ad7172 100644
--- a/core/nodejsActionBase/runner.js
+++ b/core/nodejsActionBase/runner.js
@@ -114,7 +114,11 @@ function NodeActionRunner() {
if (!error) {
resolve({ error: {}});
} else {
- resolve({ error: error });
+ // Log stack trace for rejected promises.
+ if (error.message) {
+ console.error(error)
+ }
+ resolve({ error: error.toString() });
}
});
}
diff --git
a/tests/src/test/scala/runtime/actionContainers/NodeJs8ActionContainerTests.scala
b/tests/src/test/scala/runtime/actionContainers/NodeJs8ActionContainerTests.scala
index 61fa8df..c487b89 100644
---
a/tests/src/test/scala/runtime/actionContainers/NodeJs8ActionContainerTests.scala
+++
b/tests/src/test/scala/runtime/actionContainers/NodeJs8ActionContainerTests.scala
@@ -52,4 +52,44 @@ class NodeJs8ActionContainerTests extends
NodeJsNonConcurrentTests {
}
}
+ it should "support errors thrown from async functions" in {
+ withNodeJsContainer { c =>
+ val code = """
+ | async function main() {
+ | return a.b.c
+ | }
+ """.stripMargin;
+
+ val (initCode, _) = c.init(initPayload(code))
+ initCode should be(200)
+
+ val (runCode, runRes) = c.run(runPayload(JsObject()))
+ runCode should be(200) // action writer returning an error is OK
+
+ runRes shouldBe defined
+ runRes.get.fields.get("error") shouldBe defined
+ runRes.get.fields("error").toString.toLowerCase should
include("referenceerror: a is not defined")
+ }
+ }
+
+ it should "support user thrown errors from async functions" in {
+ withNodeJsContainer { c =>
+ val code = """
+ | async function main() {
+ | throw new Error('app error')
+ | }
+ """.stripMargin;
+
+ val (initCode, _) = c.init(initPayload(code))
+ initCode should be(200)
+
+ val (runCode, runRes) = c.run(runPayload(JsObject()))
+ runCode should be(200) // action writer returning an error is OK
+
+ runRes shouldBe defined
+ runRes.get.fields.get("error") shouldBe defined
+ runRes.get.fields("error").toString.toLowerCase should include("error:
app error")
+ }
+ }
+
}