]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(ssr): reset current instance (#6184)
author似水微寒 <lhpmails@163.com>
Wed, 7 Sep 2022 09:08:52 +0000 (17:08 +0800)
committerGitHub <noreply@github.com>
Wed, 7 Sep 2022 09:08:52 +0000 (05:08 -0400)
fix #6110

packages/server-renderer/__tests__/render.spec.ts
packages/server-renderer/src/render.ts

index 9a1e1293a527976824799fb61d51bf64f44a4a94..bee393069639e5dc836df19b73954be6cc7fa7bd 100644 (file)
@@ -20,7 +20,8 @@ import {
   resolveDynamicComponent,
   renderSlot,
   onErrorCaptured,
-  onServerPrefetch
+  onServerPrefetch,
+  getCurrentInstance
 } from 'vue'
 import { escapeHtml } from '@vue/shared'
 import { renderToString } from '../src/renderToString'
@@ -779,6 +780,23 @@ function testRender(type: string, render: typeof renderToString) {
         ).toHaveBeenWarned()
         expect(`Element is missing end tag`).toHaveBeenWarned()
       })
+
+      // #6110
+      test('reset current instance after rendering error', async () => {
+        const prev = getCurrentInstance()
+        expect(prev).toBe(null)
+        try {
+          await render(
+            createApp({
+              data() {
+                return { msg: null }
+              },
+              template: `<div>{{ msg.text }}</div>`
+            })
+          )
+        } catch {}
+        expect(getCurrentInstance()).toBe(prev)
+      })
     })
 
     test('serverPrefetch', async () => {
index ae71a9e627583e577d07f41dc936ffe5e0620cca..65123ac0cd3af9fccc6a08858583a05af9854be5 100644 (file)
@@ -174,18 +174,21 @@ function renderComponentSubTree(
 
       // set current rendering instance for asset resolution
       const prev = setCurrentRenderingInstance(instance)
-      ssrRender(
-        instance.proxy,
-        push,
-        instance,
-        attrs,
-        // compiler-optimized bindings
-        instance.props,
-        instance.setupState,
-        instance.data,
-        instance.ctx
-      )
-      setCurrentRenderingInstance(prev)
+      try {
+        ssrRender(
+          instance.proxy,
+          push,
+          instance,
+          attrs,
+          // compiler-optimized bindings
+          instance.props,
+          instance.setupState,
+          instance.data,
+          instance.ctx
+        )
+      } finally {
+        setCurrentRenderingInstance(prev)
+      }
     } else if (instance.render && instance.render !== NOOP) {
       renderVNode(
         push,