Kaynağa Gözat

fix(ssr): fix bundleRenderer Promise rejection regression

Evan You 8 yıl önce
ebeveyn
işleme
0c9534ff00

+ 2 - 2
src/server/bundle-renderer/create-bundle-runner.js

@@ -106,7 +106,7 @@ export function createBundleRunner (entry, files, basedir, runInNewContext) {
     // slightly differently.
     // slightly differently.
     let runner // lazy creation so that errors can be caught by user
     let runner // lazy creation so that errors can be caught by user
     let initialContext
     let initialContext
-    return (userContext = {}) => new Promise(resolve => {
+    return (userContext = {}) => new Promise((resolve, reject) => {
       if (!runner) {
       if (!runner) {
         const sandbox = runInNewContext === 'once'
         const sandbox = runInNewContext === 'once'
           ? createSandbox()
           ? createSandbox()
@@ -143,7 +143,7 @@ export function createBundleRunner (entry, files, basedir, runInNewContext) {
 
 
       const res = runner(userContext)
       const res = runner(userContext)
       if (typeof res.then === 'function') {
       if (typeof res.then === 'function') {
-        res.then(exposeStylesAndResolve)
+        res.then(exposeStylesAndResolve).catch(reject)
       } else {
       } else {
         exposeStylesAndResolve(res)
         exposeStylesAndResolve(res)
       }
       }

+ 3 - 0
test/ssr/fixtures/promise-rejection.js

@@ -0,0 +1,3 @@
+export default () => {
+  return Promise.reject(new Error('foo'))
+}

+ 19 - 0
test/ssr/ssr-bundle-render.spec.js

@@ -75,6 +75,15 @@ function createAssertions (runInNewContext) {
     })
     })
   })
   })
 
 
+  it('renderToString catch Promise rejection', done => {
+    createRenderer('promise-rejection.js', { runInNewContext }, renderer => {
+      renderer.renderToString(err => {
+        expect(err.message).toBe('foo')
+        done()
+      })
+    })
+  })
+
   it('renderToStream catch error', done => {
   it('renderToStream catch error', done => {
     createRenderer('error.js', { runInNewContext }, renderer => {
     createRenderer('error.js', { runInNewContext }, renderer => {
       const stream = renderer.renderToStream()
       const stream = renderer.renderToStream()
@@ -85,6 +94,16 @@ function createAssertions (runInNewContext) {
     })
     })
   })
   })
 
 
+  it('renderToStream catch Promise rejection', done => {
+    createRenderer('error.js', { runInNewContext }, renderer => {
+      const stream = renderer.renderToStream()
+      stream.on('error', err => {
+        expect(err.message).toBe('foo')
+        done()
+      })
+    })
+  })
+
   it('render with cache (get/set)', done => {
   it('render with cache (get/set)', done => {
     const cache = {}
     const cache = {}
     const get = jasmine.createSpy('get')
     const get = jasmine.createSpy('get')