From 6493da5bfa4624267248deb3d31dca2a4fb22aee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=BC=E6=B0=B4=E5=BE=AE=E5=AF=92?= Date: Wed, 7 Sep 2022 17:08:52 +0800 Subject: [PATCH] fix(ssr): reset current instance (#6184) fix #6110 --- .../server-renderer/__tests__/render.spec.ts | 20 +++++++++++++- packages/server-renderer/src/render.ts | 27 ++++++++++--------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/packages/server-renderer/__tests__/render.spec.ts b/packages/server-renderer/__tests__/render.spec.ts index 9a1e1293a52..bee39306963 100644 --- a/packages/server-renderer/__tests__/render.spec.ts +++ b/packages/server-renderer/__tests__/render.spec.ts @@ -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: `
{{ msg.text }}
` + }) + ) + } catch {} + expect(getCurrentInstance()).toBe(prev) + }) }) test('serverPrefetch', async () => { diff --git a/packages/server-renderer/src/render.ts b/packages/server-renderer/src/render.ts index ae71a9e6275..65123ac0cd3 100644 --- a/packages/server-renderer/src/render.ts +++ b/packages/server-renderer/src/render.ts @@ -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,