Skip to content

Commit 957941b

Browse files
author
Sergey Zarouski
committed
Merge pull request #4 from szarouski/developer
release 1.0.0
2 parents 186dd15 + e96cf97 commit 957941b

4 files changed

Lines changed: 51 additions & 7 deletions

File tree

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,4 +113,8 @@ module.exports = React.createClass({
113113
);
114114
}
115115
});
116-
```
116+
```
117+
118+
## Error handling
119+
120+
sourcejs-react will show errors right on the page when sourcejs is launched in development mode and log errors via console.error when in other (production) mode.

core/middleware/error.jsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
var React = require('react/addons');
2+
module.exports = React.createClass({
3+
displayName: 'error.jsx',
4+
propTypes: {
5+
stack: React.PropTypes.string.isRequired
6+
},
7+
render: function () {
8+
return (
9+
<div style={{color: 'red'}}>
10+
<h1>Error: </h1>
11+
<p dangerouslySetInnerHTML={{__html: this.props.stack.replace(/\n/g, '<br>')}}></p>
12+
</div>
13+
);
14+
}
15+
});

core/middleware/index.js

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,41 @@ var _ = require('lodash');
1414
* */
1515
exports.process = function (req, res, next) {
1616
if (req.specData && req.specData.isJsx) {
17-
var pathToFile = path.join(global.app.get('user'), req.url);
1817
_.each(require.cache, function cleanAllJsxReferences(cacheObj, key) {
1918
if (path.extname(key) === '.jsx') {
2019
delete require.cache[key];
2120
}
2221
});
23-
var component = require(pathToFile);
24-
var factory = React.createFactory(component);
25-
req.specData.renderedHtml = React.renderToString(factory({}));
22+
var pathToFile = path.join(global.app.get('user'), req.url);
23+
var html;
24+
try {
25+
var component = React.createFactory(require(pathToFile));
26+
html = getHtml(component);
27+
} catch (ex) {
28+
html = getErrorAsHtml(ex);
29+
}
30+
req.specData.renderedHtml = html;
2631
}
2732

2833
next();
29-
};
34+
};
35+
36+
function getHtml(component) {
37+
try {
38+
return React.renderToString(component({}));
39+
} catch(ex) {
40+
return getErrorAsHtml(ex);
41+
}
42+
}
43+
44+
function getErrorAsHtml(ex) {
45+
if (global.MODE !== 'development') {
46+
console.error(ex);
47+
return 'Server error';
48+
}
49+
50+
var error = React.createFactory(require('./error.jsx'));
51+
return React.renderToString(error({
52+
stack: ex.stack
53+
}));
54+
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "sourcejs-react",
3-
"version": "0.0.3",
3+
"version": "1.0.0",
44
"description": "React middleware for sourcejs.com",
55
"main": "index.js",
66
"dependencies": {

0 commit comments

Comments
 (0)