From: 似水微寒 Date: Wed, 7 Sep 2022 09:08:52 +0000 (+0800) Subject: fix(ssr): reset current instance (#6184) X-Git-Tag: v3.2.39~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6493da5bfa4624267248deb3d31dca2a4fb22aee;p=thirdparty%2Fvuejs%2Fcore.git fix(ssr): reset current instance (#6184) fix #6110 --- diff --git a/packages/server-renderer/__tests__/render.spec.ts b/packages/server-renderer/__tests__/render.spec.ts index 9a1e1293a5..bee3930696 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 ae71a9e627..65123ac0cd 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,