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