0

我正在运行一个 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);
4

1 回答 1

3

您需要在返回之前先创建流,以便使用它的错误回调函数:

var readStream = fs.createReadStream(filename);
  readStream.on('error', function(err) {
    res.end(err);
  });
return readStream
于 2018-07-17T09:40:40.620 回答