Skip to content

Commit fae168a

Browse files
committed
async React components support
1 parent 69181fa commit fae168a

File tree

2 files changed

+20
-9
lines changed

2 files changed

+20
-9
lines changed

src/renderer/generateRoute.js

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
/* eslint-disable no-return-await */
12
import React from 'react';
23
import { replaceValues } from '../utils/propsUtil';
34
import { renderPage } from './renderPage';
45
import { log } from './helpers';
56
import { Error } from '../components/Error';
67

7-
function paramfn(sq, req, res, next, options) {
8+
async function paramfn(sq, req, res, next, options) {
89
// eslint-disable-next-line no-restricted-syntax
910
for (const param of sq) {
1011
switch (param.type) {
@@ -29,7 +30,8 @@ function paramfn(sq, req, res, next, options) {
2930
// res.end();
3031
break;
3132
case 'render':
32-
res.send(renderPage(param.content, { req, res }, options));
33+
// eslint-disable-next-line no-await-in-loop
34+
res.send(await renderPage(param.content, { req, res }, options));
3335
break;
3436
case 'send-file':
3537
res.sendFile(param.content.path, param.content.options, (err) => {
@@ -52,8 +54,11 @@ export function generateRoute(router, props, options = {}) {
5254
async (req, res, next) => {
5355
if (props.handler)
5456
try {
55-
await props.handler(req, res, next, (Component) =>
56-
renderPage(Component, { req, res }, options)
57+
await props.handler(
58+
req,
59+
res,
60+
next,
61+
async (Component) => await renderPage(Component, { req, res }, options)
5762
);
5863
} catch (error) {
5964
const msg = `Error in the handler passed to this route <${props.method[0].toUpperCase()}${props.method.slice(
@@ -65,14 +70,16 @@ export function generateRoute(router, props, options = {}) {
6570
res.writableEnded = true;
6671
res.statusCode = 500;
6772
if (props.method === 'get') {
68-
res.end(renderPage(() => <Error msg={msg} error={error} />, { req, res }, options));
73+
res.end(
74+
await renderPage(() => <Error msg={msg} error={error} />, { req, res }, options)
75+
);
6976
} else {
7077
res.end(msg);
7178
}
7279
}
7380

7481
if (props.paramsSeq && !res.writableEnded) {
75-
paramfn(props.paramsSeq, req, res, next, options);
82+
await paramfn(props.paramsSeq, req, res, next, options);
7683
}
7784
},
7885
]

src/renderer/renderPage.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,17 @@ import { Error } from '../components/Error';
77
import { ReqResContext } from '../context';
88
import { log } from './helpers';
99

10-
export function renderPage(Component, ctx, options) {
10+
export async function renderPage(Component, ctx, options) {
1111
try {
1212
const { appHOC, renderHTML } = options;
13+
const PrenderedComponent = await Component({ ctx });
14+
1315
const sheet = new ServerStyleSheet();
1416
const root = renderToString(
1517
sheet.collectStyles(
16-
<ReqResContext.Provider value={ctx}>{appHOC(Component)}</ReqResContext.Provider>
18+
<ReqResContext.Provider value={ctx}>
19+
{appHOC(() => PrenderedComponent)}
20+
</ReqResContext.Provider>
1721
)
1822
);
1923

@@ -26,7 +30,7 @@ export function renderPage(Component, ctx, options) {
2630
const msg = `Error while rendering React DOM Component at "${ctx.req.originalUrl}" path`;
2731
log('error', msg);
2832

29-
ctx.res.end(renderPage(() => <Error msg={msg} error={error} />, ctx, options));
33+
ctx.res.end(await renderPage(() => <Error msg={msg} error={error} />, ctx, options));
3034
return false;
3135
}
3236
}

0 commit comments

Comments
 (0)