Я использую сервер SSR React node.js, и мне нужны предложения о том, как решить мою проблему. Мой сервер node.js вылетает / перезагружается при ошибке, например, окно не определено и т.д., вместо того, чтобы просто регистрировать и распечатывать сообщение об ошибке 500.
Вот мой стрим:
try {
.......
.......
.......
const markupStream = renderToNodeStream(
<Provider store = {store}>
<ConnectedRouter history = {history} location = {context}>
<App/>
</ConnectedRouter>
</Provider>
);
if (context.url) {
return res.redirect(301, context.url)
}
return fs.createReadStream(htmlFilePath)
.pipe(htmlReplace('#root', markupStream))
.pipe(replaceStream('__SERVER_DATA__', serialize(store.getState())))
.pipe(res);
} catch (err) {
const errMarkup = renderToNodeStream(
<Provider store = {store}>
<ConnectedRouter history = {history} location = {context}>
<Error500 error = {err}/>
</ConnectedRouter>
</Provider>
);
logger.log({
level: 'error',
message: `Rendering ${req.originalUrl} fallback to Error render method`,
...{
errorMessage: err.message,
stack: err.stack
}
});
return fs.createReadStream(htmlFilePath)
.pipe(htmlReplace('#root', errMarkup))
.pipe(res.status(500));
} finally {
logger.info(`Request finished ${req.originalUrl} :: ${res.statusCode}`)
end({ route: path, componentName: componentNames[0], code: res.statusCode })
logger.profile(profileMsg);
}
Я думал, что моя уловка получит эти ошибки, но, видимо, нет, может ли кто-нибудь помочь мне указать мне правильное направление?
ОБНОВЛЕНИЕ: 1 В настоящее время я пытаюсь:
const readStream = fs.createReadStream(htmlFilePath);
// Should hopefully catch the errors
readStream.on('error', function(err) {
res.end(err);
});
return readStream.pipe(htmlReplace('#root', markupStream))
.pipe(replaceStream('__SERVER_DATA__', serialize(store.getState())))
.pipe(res);
Вам нужно сначала создать поток, прежде чем возвращать его, чтобы использовать его функцию обратного вызова ошибки:
var readStream = fs.createReadStream(filename);
readStream.on('error', function(err) {
res.end(err);
});
return readStream