在服务器端,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重定向,这不是错误.它改变了什么吗?
我不认为这与 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\nif ( ValidPaths.contains(path) ) {\n render()\n} else {\n res.send(404)\n}\nRun Code Online (Sandbox Code Playgroud)\n\n如果您有可能在不引发异常的情况下处理错误,请注意使用异常是有成本的,特别是因为 stacktrace。已经有针对服务器的 DOS 攻击在服务器上产生了大量异常。对于非异常的事情,最好不要使用异常。请注意这一点,并选择自己是否有黑客试图对您进行 DOS 攻击:)
\n\n无论如何,我认为 Javascript 异常处理是一个真正的痛苦:(
\n| 归档时间: |
|
| 查看次数: |
1697 次 |
| 最近记录: |