Skip to content

Commit 462af01

Browse files
committed
Handle asyncrhonous errors
1 parent ceba64f commit 462af01

File tree

2 files changed

+36
-5
lines changed

2 files changed

+36
-5
lines changed

README.md

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,9 @@ The callback is called **after** the event has been sent to the Sentry server.
150150

151151
## Integrations
152152
### Connect/Express middleware
153-
The Raven middleware can be used as-is with either Connect or Express in the same way. Take note that in your middlewares, Raven must appear _after_ your main handler to pick up any errors that may result from handling a request.
153+
The Raven middleware can be used as-is with either Connect or Express in the same way.
154154

155-
#### Connect
155+
#### Connect and Express
156156
```javascript
157157
var connect = require('connect');
158158
function mainHandler(req, res) {
@@ -165,22 +165,34 @@ function onError(err, req, res, next) {
165165
res.end(res.sentry+'\n');
166166
}
167167
connect(
168+
// Should be the first item listed
169+
raven.middleware.connect.requestHandler('{{ SENTRY_DSN }}'),
170+
168171
connect.bodyParser(),
169172
connect.cookieParser(),
170173
mainHandler,
171-
raven.middleware.connect('{{ SENTRY_DSN }}'),
174+
175+
// Should come before any other error middleware
176+
raven.middleware.connect.errorHandler('{{ SENTRY_DSN }}'),
172177
onError, // optional error handler if you want to display the error id to a user
173178
).listen(3000);
174179
```
175180

176181
#### Express
177182
```javascript
178183
var app = require('express')();
184+
179185
app.get('/', function mainHandler(req, res) {
180186
throw new Error('Broke!');
181187
});
182-
app.use(raven.middleware.express('{{ SENTRY_DSN }}'));
188+
189+
// Should be the first item listed
190+
app.use(raven.middleware.express.requestHandler('{{ SENTRY_DSN }}'));
191+
192+
// Should come before any other error middleware
193+
app.use(raven.middleware.express.errorHandler('{{ SENTRY_DSN }}'));
183194
app.use(onError); // optional error handler if you want to display the error id to a user
195+
184196
app.listen(3000);
185197
```
186198

lib/middleware/connect.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
var raven = require('../client');
22
var parsers = require('../parsers');
33

4-
module.exports = function connectMiddleware(client) {
4+
// Legacy support
5+
var connectMiddleware = function(client) {
6+
return connectMiddleware.errorHandler(client);
7+
};
8+
9+
// Error handler. This should be the last item listed in middleware, but
10+
// before any other error handlers.
11+
connectMiddleware.errorHandler = function(client) {
512
client = (client instanceof raven.Client) ? client : new raven.Client(client);
613
return function(err, req, res, next) {
714
var status = err.status || err.statusCode || err.status_code || 500;
@@ -16,3 +23,15 @@ module.exports = function connectMiddleware(client) {
1623
});
1724
};
1825
};
26+
27+
// Ensures asynchronous exceptions are routed to the errorHandler. This
28+
// should be the **first** item listed in middleware.
29+
connectMiddleware.requestHandler = function(client) {
30+
return function(req, res, next) {
31+
var reqDomain = domain.create();
32+
reqDomain.on('error', next);
33+
return reqDomain.run(next);
34+
};
35+
};
36+
37+
module.exports = connectMiddleware;

0 commit comments

Comments
 (0)