запрос get не попал в мой обработчик экспресс-маршрута - PullRequest
0 голосов
/ 02 марта 2019

Я создаю приложение SSR с помощью Express, и вот точка входа моего простого сервера рендеринга

src / server / server.ts

import * as express from 'express';
import renderer from 'src/server/renderer';
import proxy = require('express-http-proxy');
import createStore from 'src/helpers/createStore';
import config from '@config/index';
import 'express-async-errors';


const app = express();

const port = 3000 || process.env.PORT

app.use(function (req, res, next) {
  res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
  res.header('Expires', '-1');
  res.header('Pragma', 'no-cache');
  next()
});

app.use('/api', proxy(config.API))

app.set("etag", false)

app.use(express.static('build/client/'))

app.get('*', async (req, res) => {

  console.log(`request headers`, req.headers)
  console.log('req.get.cookie', req.get("cookie"))
  const store = await createStore(req)

  const content = renderer(req, store);

  res.send(content);
})

process.on("unhandledRejection", err => {
  console.log("We have unhandleRejection", err)
})

process.on("uncaughtException", err => {
  console.log("We have uncaughtException", err)
})



app.listen(port, () => {
  console.log(`Render server running on port: ${port}`)
})

IИметь один обработчик get route для ('*') каждого маршрута, если запрос попадает на этот маршрутизатор, переходит к функции рендерера и создает динамическую строку html и возвращает ее.вот моя функция рендерера

src / server / renderer.ts

import * as React from 'react';
import { renderToString } from 'react-dom/server';
import { StaticRouter } from 'react-router-dom';
import { renderRoutes } from 'react-router-config';
import Routes from '@client/Routes';
import { Request } from 'express';
import { ServerStyleSheet } from 'styled-components';
import { Store } from 'redux';
import { Provider } from 'react-redux';
import * as html from 'build/client/index.html';


export default (req: Request, store: Store) => {

  const tree = (
    <Provider store={store}>
      <StaticRouter location={req.path} context={{}}>
        <div>{renderRoutes(Routes)}</div>
      </StaticRouter>
    </Provider>
  );
  const sheet = new ServerStyleSheet();
  renderToString(sheet.collectStyles(tree));
  const styleTags = sheet.getStyleTags();
  console.log(styleTags)

  const content = renderToString(tree);

  return html.replace("$styleTags$", styleTags).replace("$content$", content);

}

В основном она находит подходящие компоненты маршрутов, соответствующие стили и вводит их в htmlи верни это.но всякий раз, когда я запрашиваю домашний маршрут (localhost: 3000), он просто не попадает в мою функцию обработчика маршрута и возвращает html, а bundle.js в мою папку статических папок ("build / client /) для работы со статическими ресурсами.Я не знаю причину, но это не касается моего единственного обработчика маршрута !!, и я могу убедиться в том, что он не выполняет console.log в первых двух строках моего обработчика маршрута, и я установил отладчикдля этого тоже. Он не попадает и не возвращает странное содержимое, которое, как предполагается, было создано некоторое время назад.

Это мой запрос и ответ в инструменте разработчика браузера (я использую Chrome) enter image description here

Я думаю, что это как-то связано с кешем, поэтому я копаюсь на этом и отключаю опцию кеширования в браузере (я полагаю, что заголовок Cache-control равен no-cache) и отключаю'etag' на моем сервере и установите ответ, чтобы не делать кеш. Но он все тот же. Как я могу это исправить, пожалуйста?

...