如何在一个反应​​组件中返回一个http错误?

在服务器端,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; } } 

这是一个有效的解决scheme? 你有没有另一个想法?

编辑:我想扩大这种情况下3xx httpredirect这是不是错误。 它会改变什么吗?

我不认为这与React有关,但实际上与任何框架有关。

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

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

您正在抛出不属于http抽象的React应用程序exception,因此不应该知道http状态码。 您应该抛出有意义的exception,以抽象方式呈现内联HTML中的React应用程序,然后捕获这些exception并在catch块中select适当的错误代码。 这只是你的实现的一个细节,但在大代码的基础上它很重要。

顺便说一下,你不应该认为你可以捕获的exception总是会抛出exception(也就是具有httpError属性)。 任何代码都可以抛出一个exception,即使你很确定这不是一个坏主意。 如果发生这种情况,结果可能是res.send(undefined); 这可能会触发另一个exception,你不会有这种exception的原因,因为它被你的假设所吞噬,你的代码不会抛出任何意外的exception。

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

 if ( ValidPaths.contains(path) ) { render() } else { res.send(404) } 

如果您有可能在不抛出exception的情况下处理错误,那么请注意, 使用exception是有代价的,特别是因为堆栈跟踪 。 在服务器上已经有DOS攻击来产生很多的例外。 对于非例外的事情,不要使用例外总是更好的。 只要知道这一点,并select自己,如果一个黑客试图DOS你是例外或不:)

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