¿Cómo puedo crear un middleware Express/Connect que ajuste cada solicitud en su propio dominio?Cómo usar los dominios Node.js 0.8.x con express?
Respuesta
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();
});
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.
Esto puede haber sido una buena respuesta en un punto, pero 'express.createServer' está en desuso. – Jess
¿Cuál es el propósito de esto si no tiene un manejo de error específico para ese dominio? –
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.
Esto no significa proteger contra excepciones lanzadas en libs de terceros ... :( – Jess
@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. –
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
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.");
}));
}));
}));
});
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 –
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!
- 1. ¿Cómo usar SCSS con Express? (Node.js)
- 2. node.js - utilizando soldadura con express?
- 3. Localización en node.js con express
- 4. Eventos personalizados en Node.js con Express framework
- 5. Llamadas API simples con Node.js y Express
- 6. Integrando Angular.js con Node.js (Express + Tower.js)
- 7. enrutamiento Node.js/Express con params get
- 8. Node.js/Express Caching
- 9. internacionalización en Node.js, Express, i18n
- 10. Integrando Ember.js con Node.js (Express + Tower.js)
- 11. ¿Cómo puedo implementar directorios virtuales con node.js y express?
- 12. Node.js + Express - ¿Cómo funciona parciales de bigote?
- 13. Cómo manejar errores en Node.js usando Express
- 14. ¿Cómo atrapo los errores del servidor node.js/express como EADDRINUSE?
- 15. ¿Cómo usar Prototype.js con Node.js?
- 16. Node.js, Express y Jade - Formas
- 17. ¿Cómo manejar rutas relativas en node.js/express?
- 18. Node.js y Express en Windows
- 19. node.js express app.get y app.post
- 20. ¿Cómo hacer la autenticación con Node.js, Express y Mongoose?
- 21. Node.js + Express: Rutas vs controlador
- 22. ¿Cómo se obtienen los datos de solicitud con socket.io con node.js y express?
- 23. Obtener el contenido de la URL en Node.js con Express
- 24. Rutas de vista múltiple en Node.js + Express
- 25. Encabezados no configurados con redirección usando node.js/Express
- 26. Duración de la sesión en node.js con express y MongoDB
- 27. Cómo recibir JSON en la solicitud POST de node.js express?
- 28. X-Frame-opciones permiten-De múltiples dominios
- 29. Validación de HMAC MD5 con Node.js, Express y Trialpay
- 30. Comprensión de vhost en Express Node.js
¿Has probado esto? No funciona para mí y domain.enter no está documentado en el sitio del nodo. –
Esto funciona para mí. No sé por qué domain.enter no está documentado. –
Debo añadir que me preocupa que este código llame a domain.enter pero no haya domain.exit correspondiente. Parece una posible fuga. –