【问题标题】:Node.js createReadStream error handlingNode.js createReadStream 错误处理
【发布时间】:2018-07-17 17:47:09
【问题描述】:

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

我以为我的 catch 会出现这些错误,但显然不是,有人可以帮我指出正确的方向吗?

更新: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);

【问题讨论】:

    标签: javascript node.js server-side-rendering node-streams


    【解决方案1】:

    你需要先创建流再返回,以便使用它的错误回调函数:

    var readStream = fs.createReadStream(filename);
      readStream.on('error', function(err) {
        res.end(err);
      });
    return readStream
    

    【讨论】:

    • const readStream = fs.createReadStream(htmlFilePath); // 希望能捕获错误 readStream.on('error', function(err) { res.end(err); }); // 如果没有问题返回 readStream() .pipe(htmlReplace('#root', markupStream)) .pipe(replaceStream('SERVER_DATA', serialize(store.getState()))) .pipe (res);
    • 喜欢上面的评论吗?
    • 是的。正如您在问题中更新的那样。有效吗?
    • 我现在正在部署它。我会让你知道 :) 谢谢你的帮助
    • 是的,它应该能很好地捕捉到。但是我们可以尝试不使用 return 吗?因为管道无论如何都会将其添加到 res 中。
    猜你喜欢
    • 2021-11-04
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多