2012-07-22 18 views

Respuesta

12

Este conjunto de diapositivas en la cubierta del altavoz da una visión sucinta:

expreso código de middleware de las diapositivas:

var createDomain = require('domain').create; 

app.use(function(req, res, next) { 
    var domain = createDomain(); 

    domain.on('error', function(err) { 
    // alternative: next(err) 
    res.statusCode = 500; 
    res.end(err.message + '\n'); 

    domain.dispose(); 
    }); 

    domain.enter(); 
    next(); 
}); 
+4

¿Has probado esto? No funciona para mí y domain.enter no está documentado en el sitio del nodo. –

+0

Esto funciona para mí. No sé por qué domain.enter no está documentado. –

+3

Debo añadir que me preocupa que este código llame a domain.enter pero no haya domain.exit correspondiente. Parece una posible fuga. –

5

he tenido buena suerte en sustitución la acción

var app = express.createServer(); 

con:

var domainCreate = require('domain').create; 
var app = express.createServer(function (req, res, next) { 
    var domain = domainCreate(); 
    domain.run(next); 
}); 

Luego, en el middleware se pueden añadir propiedades a process.domain o añadir gestión de errores adicionales.

+1

Esto puede haber sido una buena respuesta en un punto, pero 'express.createServer' está en desuso. – Jess

+0

¿Cuál es el propósito de esto si no tiene un manejo de error específico para ese dominio? –

12

ACTUALIZACIÓN: El enfoque que se describe a continuación se ha implementado en el módulo NodeJS connect-domain, que se puede utilizar en aplicaciones Connect o Express.

A partir de Express 3, express.createServer está en desuso, y su devolución de llamada se debe convertir a un middleware. En el middleware, es importante agregar los objetos de solicitud y resultado al dominio de solicitud para que los errores disparados por ellos sean manejados por el controlador de error de dominio.

Mi middleware es como la siguiente:

var domain = require('domain'); 

app.use(function(req, res, next) { 
    var requestDomain = domain.create(); 
    requestDomain.add(req); 
    requestDomain.add(res); 
    requestDomain.on('error', next); 
    requestDomain.run(next); 
}); 

Puede evitar la adición de la solicitud y la respuesta a una solicitud de dominio de si se llama http.createServer desde dentro de un dominio de nivel superior, pero los documentos de dominio parecería indicar que los dominios por solicitud son una mejor práctica.

Tenga en cuenta que el código anterior no realiza ninguna acción de limpieza de dominio, como la eliminación forzosa del dominio de solicitud. Mi middleware elige pasar el error a través de la pila de middleware para ser manejado posteriormente por un middleware específico de manejo de errores. YMMV.

+0

Esto no significa proteger contra excepciones lanzadas en libs de terceros ... :( – Jess

+0

@Jess, admito que el manejo de errores aquí es ingenuo, pero tengo curiosidad por lo que está viendo. En teoría, cualquier excepción debería ser capturada por el dominio, y se proporciona como un argumento de "error" para la pila, suponiendo que sus manejadores tienen uno. –

+0

Estoy usando una secuencia que arrojará una excepción si la cláusula where no tiene una sintaxis válida, por ejemplo. No puedo cambiar el código t o 'emit' en lugar de' throw'. He intentado todas las soluciones que figuran aquí y ninguna parece captar el error lanzado. – Jess

2

Esta es una respuesta tardía, pero echa un vistazo al módulo express-domain-moddleware. Crea automáticamente un nuevo dominio para cada solicitud. El dominio activo puede ser referenciado por process.domain en sus rutas. He aquí un ejemplo:

//with domain-middleware 
app.use(require('express-domain-middleware')); 
app.use(app.router); 

app.use(function errorHandler(err, req, res, next) { 
    console.log('error on request %d %s %s: %j', process.domain.id, req.method, req.url, err); 
    res.send(500, "Something bad happened. :("); 
    if(err.domain) { 
    //you should think about gracefully stopping & respawning your server 
    //since an unhandled error might put your application into an unknown state 
    } 
}); 

app.get('/error', function(req, res, next) { 
    db.query('SELECT happiness()', process.domain.intercept(function(rows) { 
    fs.readFile('asldkfjasdf', process.domain.intercept(function(contents) { 
     process.nextTick(process.domain.intercept(function() { 
     throw new Error("The individual request will be passed to the express error handler, and your application will keep running."); 
     })); 
    })); 
    })); 
}); 
+0

Volví a subir esto porque 'express-domain-middleware' se parece a la respuesta más correcta (y aún mantenida) a esta pregunta. Junto con 'node-ok' del mismo autor parece una solución robusta para el manejo de errores en node/express. Añadiré un enlace más que también está relacionado con el mismo tema: cómo responder a los errores una vez que son capturados: https://github.com/hapijs/boom –

0

Los dominios están en desuso actualmente en el nodo:

https://nodejs.org/api/domain.html

A los efectos de 'errores de zonificación', he creado una biblioteca que le permite escribir asíncrono código de una manera agradable: https://github.com/vacuumlabs/yacol. Una de sus ventajas es que puede tener un comportamiento similar a un dominio con una semántica muy agradable; ¡Echale un vistazo!

Cuestiones relacionadas