如何在react组件中返回http错误?

Jul*_*tin 6 node.js reactjs

在服务器端,reactjs组件应该如何通知节点应用程序返回http错误?

我的第一个想法是抛出一个错误:

var notFound = function () {
    var error = new Error("Not Found");
    error.httpError = 404;
    throw error;    
};

var App = React.createClass({
    render: function () {
        return react.DOM.div(null,
            Locations({path: this.props.path},
                Location({path: "/", handler: home}),
                NotFound({handler: notFound})
            )
        );
    }
});

try {
    res.send(React.renderComponentToString(app()));
}
catch (err) {
    if(err.httpError) {
        res.send(err.httpError);
    } else {
        throw err;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是有效的解决方案吗?你有另一个想法吗?

编辑:我想将此案例扩展到3xx http重定向,这不是错误.它改变了什么吗?

Seb*_*ber 1

我不认为这与 React 有关,而是与任何框架有关。

\n\n

我认为这份文档可以帮助您回答自己的问题:\n https://www.joyent.com/developers/node/design/errors

\n\n

但是,您应该检查 Java 世界中的这些(还不够)众所周知的规则:

\n\n\n\n

您抛出的 React 应用程序异常不属于 http 抽象,因此不应该知道 http 状态代码。您应该抛出有意义的异常,以在内联 HTML 中渲染 React 应用程序的抽象,然后捕获这些异常并在 catch 块中选择适当的错误代码。这只是您的实现的一个细节,但对于大型代码库来说它很重要。

\n\n

顺便说一句,您不应该假设您可以捕获的异常始终是您抛出的异常(即 w\xc3\xacll 具有该httpError属性)。任何代码都可能抛出异常,即使您非常确定它不会抛出异常,处理这个问题也不是一个坏主意。如果发生这种情况,您最终可能会得到一个结果res.send(undefined);,该结果可能会触发另一个异常,并且您不会知道该异常的原因,因为它被您的代码不会抛出任何意外异常的假设所吞噬。

\n\n

另一个需要知道的原则是快速失败。如果你可以在渲染之前处理错误,你宁愿在渲染之前处理它。就像是:

\n\n
if ( ValidPaths.contains(path) ) {\n   render()\n} else {\n   res.send(404)\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您有可能在不引发异常的情况下处理错误,请注意使用异常是有成本的,特别是因为 stacktrace。已经有针对服务器的 DOS 攻击在服务器上产生了大量异常。对于非异常的事情,最好不要使用异常。请注意这一点,并选择自己是否有黑客试图对您进行 DOS 攻击:)

\n\n

无论如何,我认为 Javascript 异常处理是一个真正的痛苦:(

\n