Ошибка EPIPE при перенаправлении, Koa js, SSR для React - PullRequest
0 голосов
/ 14 января 2019

Мне нужно сделать редирект для SSR (Koa.js + React.js) Если пользователь зашел на главную страницу со строкой запроса, например site.ru/?test, то нам нужно перенаправить site.ru

На localhost все работает нормально, но не работает тестовая или продвинутая версия (сбой и некоторые ошибки)

Можете ли вы проверить мои экраны, пожалуйста

введите описание изображения здесь

0|ssr-serv | 14-01-2019 10:07:42: { s: '' } 's'
0|ssr-serv | 14-01-2019 10:07:42: { s: '' } 's'
0|ssr-serv | 14-01-2019 10:07:42: Error: write EPIPE 
0|ssr-serv | at _errnoException (util.js:1003:13)
0|ssr-serv | at WriteWrap.afterWrite (net.js:866:14

Итак, почему у меня ошибка EPIPE?

import Router from 'koa-router';
import get from 'lodash/get';
import 'colors';
import moment from 'moment';
import {
  getOldTestament,
  getNewTestament,
  getReading,
  getArticle,
  getInterpretations,
  getTranslates,
  getSlider,
  getMeta,
} from '../../libs/getData';
import checkReading from './checkReading';
import titleToVerseInReading from './titleToVerseInReading';

const router = new Router();

router.get('/', async (ctx, next) => {
  let initialStore = {};
  let directProps = {};
  const { meta, headers } = ctx.locals;
  let metaData = {};

  // Redirect

  console.log(ctx.request.query, ctx.request.querystring);
  if (ctx.request.querystring && ctx.request.querystring !== 'auth-need') {
    console.log(ctx.request.query, ctx.request.querystring);
    ctx.redirect('/');
  }

  //

  try {
    const [
      _oldTestament,
      _newTestament,
      _reading,
      _article,
      _interpretations,
      _sliders,
      _meta,
      _translates,
    ] = await Promise.all([
      getOldTestament(headers),
      getNewTestament(headers),
      getReading(headers),
      getArticle(headers),
      getInterpretations(headers),
      getSlider(),
      getMeta('main'),
      getTranslates(headers),
    ]);

    // TODO add to redux
    // const { interpretations, pages } = get(_interpretations, 'data');
    const { gospel_reading, apostolic_reading, morning_reading, more_reading, ...other } = get(
      _reading,
      'data.reading',
      [],
    );

    const [
      _gospel_reading,
      _apostolic_reading,
      _morning_reading,
      _more_reading,
    ] = await Promise.all([
      checkReading(gospel_reading),
      checkReading(apostolic_reading),
      checkReading(morning_reading),
      checkReading(more_reading),
    ]);

    metaData = get(_meta, 'data.meta', {});

    initialStore = {
      books: {
        oldTestament: get(_oldTestament, 'data.books', []),
        newTestament: get(_newTestament, 'data.books', []),
      },
      lid: {
        data: {
          reading: {
            gospel_reading: titleToVerseInReading(gospel_reading, _gospel_reading),
            apostolic_reading: titleToVerseInReading(apostolic_reading, _apostolic_reading),
            morning_reading: titleToVerseInReading(morning_reading, _morning_reading),
            more_reading: titleToVerseInReading(more_reading, _more_reading),
            ...other,
          },
        },
      },
      // article: { article },
      translates: { translates: get(_translates, 'data.translates', []) },
    };

    directProps = {
      latestNewsList: get(_article, 'data.article', []),
      latestInterpretationsList: get(_interpretations, 'data.interpretations', []).map(inter => ({
        id: inter.id,
        username: inter.added_by.username,
        date: moment
          .unix(inter.added_at)
          .locale('ru')
          .format('DD MMM YYYY'),
        verse: inter.verse[0],
        author: get(inter, 'ekzeget.name', ''),
        authorId: get(inter, 'ekzeget.id', 0),
        investigated: inter.investigated,
      })),
      latestInterpretationsTotal: get(_interpretations, 'data.pages.totalCount', 0),
      latestSlider: get(_sliders, 'data', {}),
    };
  } catch (error) {
    console.error(error);
  }

  const { title, description } = metaData;

  meta.push({
    name: 'description',
    content: description,
  });

  ctx.locals = {
    initialStore,
    meta,
    directProps,
    title,
  };
  await next();
});

export default router;

1 Ответ

0 голосов
/ 14 января 2019

Хорошо, я только что добавил return, потому что нам нужно остановить наш код, если

console.log(ctx.request.query, ctx.request.querystring);
  if (ctx.request.querystring && ctx.request.querystring !== 'auth-need') {
    console.log(ctx.request.query, ctx.request.querystring);
    ctx.redirect('/');
    return;
  }
...