Fix regression: Errors not emitted in streams (#14314)
Regression introduced in #14182 resulted in errors no longer being emitted on streams, breaking many consumers. Co-authored-by: Elliot Jalgard <elliot.j@live.se>
Pelle Wessman committed
Nov 27, 2018 at 14:00 UTC
ee3ef3a0792c0ad777270739fe5ff126e3d57992
2 files changed
+48
-1
packages/react-dom/src/__tests__/ReactServerRendering-test.js
+46
@@ -556,6 +556,52 @@ describe('ReactDOMServer', () => {
556
});
557
});
558
559
+ describe('renderToNodeStream', () => {
560
+ it('should generate simple markup', () => {
561
+ const SuccessfulElement = React.createElement(() => <img />);
562
+ const response = ReactDOMServer.renderToNodeStream(SuccessfulElement);
563
+ expect(response.read().toString()).toMatch(
564
+ new RegExp('<img data-reactroot=""' + '/>'),
565
+ );
566
+ });
567
+
568
+ it('should handle errors correctly', () => {
569
+ const FailingElement = React.createElement(() => {
570
+ throw new Error('An Error');
571
+ });
572
+ const response = ReactDOMServer.renderToNodeStream(FailingElement);
573
+ return new Promise(resolve => {
574
+ response.once('error', () => {
575
+ resolve();
576
+ });
577
+ expect(response.read()).toBeNull();
578
+ });
579
+ });
580
+ });
581
+
582
+ describe('renderToStaticNodeStream', () => {
583
+ it('should generate simple markup', () => {
584
+ const SuccessfulElement = React.createElement(() => <img />);
585
+ const response = ReactDOMServer.renderToStaticNodeStream(
586
+ SuccessfulElement,
587
+ );
588
+ expect(response.read().toString()).toMatch(new RegExp('<img' + '/>'));
589
+ });
590
+
591
+ it('should handle errors correctly', () => {
592
+ const FailingElement = React.createElement(() => {
593
+ throw new Error('An Error');
594
+ });
595
+ const response = ReactDOMServer.renderToStaticNodeStream(FailingElement);
596
+ return new Promise(resolve => {
597
+ response.once('error', () => {
598
+ resolve();
599
+ });
600
+ expect(response.read()).toBeNull();
601
+ });
602
+ });
603
+ });
604
+
605
it('warns with a no-op when an async setState is triggered', () => {
606
class Foo extends React.Component {
607
UNSAFE_componentWillMount() {
packages/react-dom/src/server/ReactDOMNodeStreamRenderer.js
+2
-1
@@ -18,8 +18,9 @@ class ReactMarkupReadableStream extends Readable {
18
this.partialRenderer = new ReactPartialRenderer(element, makeStaticMarkup);
19
}
20
21
- _destroy() {
21
+ _destroy(err, callback) {
22
this.partialRenderer.destroy();
23
+ callback(err);
24
}
25
26
_read(size) {