Как Redis кешировать Apollo-getMarkupFromTree? - PullRequest
0 голосов
/ 10 апреля 2019

Используя сервер Nodejs / Express, мне удается кэшировать весь ответ, а не только apollo getMarkupFromTree.GetMarkupFromTree занимает много времени, чтобы закончить.Мне нужно просто кешировать эту часть, потому что я не хочу кешировать корзину покупок.

Часть содержимого (см. Ниже в коде) отображает только / потоков нижний колонтитул и nav когда Redis кэширует getMarkupFromTree.StartHtml, middleHtml, endHtml отображаются полностью.

Кэширование всего сайта работает хорошо.Попробовал добавил, жду разные части и все без изменений.redisCache.get (...) возвращает ожидаемый результат.ApolloClientExtract возвращает ожидаемый результат.

const renderer = async (req, res) => {
  const redisCache = new RedisCache();

  const helmetContext = {};
  // APOLLO
  const client = apolloClient(req);

  // REDUX
  const store = await reduxPersist(req);
  const context = {};

  // STYLED COMPONENTS
  const sheet = new ServerStyleSheet();

  // APPLICATION
  const Root = () => (
    <AppTree
      client={client}
      store={store}
      helmetContext={helmetContext}
      req={req}
      context={context}
      extractor={extractor}
    />
  );

  // REDUX
  const finalState = store.getState();

  // @loadable/server
  extractor.collectChunks(<Root />);
  extractor.getLinkTags();

  // WRITE START HTML
  res.write(startHtml({ extractor }));
  // res.flushHeaders();

  let apolloClientExtract = {};
  let redisApolloExtract = '';
  try {
    redisApolloExtract = await redisCache.get('teuberkohlhoff apolloExtract');
  } catch (err) {
    console.log('Error', err);
  }

  // let markupFromTree = '';
  if (redisApolloExtract) {
    // ADDING getMarkupFromTree here leads to the expected result
    renderToString(<Root />); // needed for @loadable/server
    apolloClientExtract = redisApolloExtract;
  } else {
    // Apollo
    await getMarkupFromTree({
      renderFunction: renderToString,
      tree: <Root />
    });
    apolloClientExtract = serialize(client.extract());
    redisCache.set('teuberkohlhoff apolloExtract', apolloClientExtract);
  }

  // WRITE MIDDLE HTML
  res.write(middleHtml({ helmetContext, scripts }));
  // res.flushHeaders();

  const content = sheet.collectStyles(<Root />); // HERE I think something is wrong

  // PIPE CONTENT
  const stream = sheet.interleaveWithNodeStream(renderToNodeStream(content));
  stream.pipe(
    res,
    { end: false }
  );

  const reduxFinalState = serialize(finalState);

  // WRITE END HTML
  stream.on('end', () => res.end(endHtml({ extractor, apolloClientExtract, reduxFinalState })));
};

Как работает getMarkupFromTree и что такое возврат?

Как правильно кешировать getMarkupFromTree?

...