]> git.kaiwu.me - njs.git/commitdiff
Fixed unhandled promise rejection in handle events.
authorAlexander Borisov <alexander.borisov@nginx.com>
Fri, 8 Oct 2021 09:32:42 +0000 (12:32 +0300)
committerAlexander Borisov <alexander.borisov@nginx.com>
Fri, 8 Oct 2021 09:32:42 +0000 (12:32 +0300)
This closes #423 issue on GitHub.

src/njs.h
src/njs_shell.c
src/njs_vm.c
test/js/promise_rejection_tracker.js [new file with mode: 0644]
test/njs_expect_test.exp

index ef238dc1ef089cafc0a0a0c4c5807d78580776bf..2ead2f96403a7595bf60309b538d4553e22d92fa 100644 (file)
--- a/src/njs.h
+++ b/src/njs.h
@@ -265,6 +265,9 @@ NJS_EXPORT njs_int_t njs_vm_posted(njs_vm_t *vm);
 
 #define njs_vm_pending(vm)  (njs_vm_waiting(vm) || njs_vm_posted(vm))
 
+#define njs_vm_unhandled_rejection(vm)                                         \
+    ((vm)->options.unhandled_rejection == NJS_VM_OPT_UNHANDLED_REJECTION_THROW \
+    && (vm)->promise_reason != NULL && (vm)->promise_reason->length != 0)
 
 /*
  * Runs the specified function with provided arguments.
index dd9e77c847ed31b16cbdd6e525c3fdc19c78989e..bfa9a375aa4b41cfebf715f5df2919b8a863ac86 100644 (file)
@@ -868,7 +868,7 @@ njs_process_script(njs_opts_t *opts, njs_console_t *console,
     }
 
     for ( ;; ) {
-        if (!njs_vm_pending(vm)) {
+        if (!njs_vm_pending(vm) && !njs_vm_unhandled_rejection(vm)) {
             break;
         }
 
index 834e0a66402ef73e2eaade685be56d87bc74d478..16cd2f49fc288fc5643defd14d0ec668a0f33e4b 100644 (file)
@@ -504,24 +504,20 @@ njs_vm_handle_events(njs_vm_t *vm)
             }
         }
 
-        if (vm->options.unhandled_rejection
-            == NJS_VM_OPT_UNHANDLED_REJECTION_THROW)
-        {
-            if (vm->promise_reason != NULL && vm->promise_reason->length != 0) {
-                ret = njs_value_to_string(vm, &string,
-                                          &vm->promise_reason->start[0]);
-                if (njs_slow_path(ret != NJS_OK)) {
-                    return ret;
-                }
-
-                njs_string_get(&string, &str);
-                njs_vm_error(vm, "unhandled promise rejection: %V", &str);
-
-                njs_mp_free(vm->mem_pool, vm->promise_reason);
-                vm->promise_reason = NULL;
-
-                return NJS_ERROR;
+        if (njs_vm_unhandled_rejection(vm)) {
+            ret = njs_value_to_string(vm, &string,
+                                      &vm->promise_reason->start[0]);
+            if (njs_slow_path(ret != NJS_OK)) {
+                return ret;
             }
+
+            njs_string_get(&string, &str);
+            njs_vm_error(vm, "unhandled promise rejection: %V", &str);
+
+            njs_mp_free(vm->mem_pool, vm->promise_reason);
+            vm->promise_reason = NULL;
+
+            return NJS_ERROR;
         }
 
         for ( ;; ) {
diff --git a/test/js/promise_rejection_tracker.js b/test/js/promise_rejection_tracker.js
new file mode 100644 (file)
index 0000000..db06e22
--- /dev/null
@@ -0,0 +1 @@
+Promise.reject(1);
\ No newline at end of file
index e04a89edffa51f4e31b4228393ef5368b23f38e5..cc3bebeb7004f1736913d9c552d86bd5a5e5c139 100644 (file)
@@ -1085,6 +1085,10 @@ njs_run {"./test/js/promise_reject_catch.js"} \
 njs_run {"./test/js/promise_reject_post_catch.js"} \
 "Error: unhandled promise rejection: undefined"
 
+njs_run {"./test/js/promise_rejection_tracker.js"} \
+"Thrown:
+Error: unhandled promise rejection: 1"
+
 njs_run {"./test/js/promise_all.js"} \
 "resolved:\\\[\\\['one','two'],\\\['three','four']]"