2012-03-29 22 views
15

Estoy escribiendo una aplicación web en node.js. Ahora, cada procesamiento en el servidor siempre se realiza en el contexto de una sesión que se recupera o se crea en la primera etapa cuando la solicitud llega al servidor. Después de esto, la ejecución fluye a través de múltiples módulos y devoluciones de llamada dentro de ellos. Lo que me cuesta es crear un patrón de programación para que, en cualquier punto del código, el objeto de sesión esté disponible sin que el programador lo exija como argumento en cada llamada de función.Node.js Patrón de programación para obtener el contexto de ejecución

Si todo el código estuviera en un solo archivo podría haber tenido un cierre, pero si hay llamadas a otros módulos en otros archivos, ¿cómo programo para que el objeto de sesión esté disponible en la función llamada sin pasarlo? como un argumento Siento que debería haber algún vínculo entre las dos funciones en los dos archivos, pero cómo arreglar eso es donde me estoy estancando.

En general, me gustaría decir que siempre hay un contexto de ejecución que podría ser una sesión o una solicitud de red cuyo procesamiento se distribuye en varios archivos y el objeto de contexto de ejecución estará disponible en todos los puntos. En realidad, puede haber varios casos de uso como tener un objeto de registro para cada solicitud de red o un objeto de registro por sesión. Y las tuberías necesarias para hacer este trabajo deberían instalarse de lado sin que el programador de la aplicación se preocupe por ello. Él solo sabe que ese contexto de ejecución está disponible en todos los lugares.

Creo que debería ser un problema bastante común para todos, así que por favor denme algunas ideas.

A continuación se presenta el problema

MainServer.js 


    app = require('express').createServer(); 
    app_module1 = require('AppModule1'); 
    var session = get_session(); 
    app.get('/my/page', app_module1.func1); 

AppModule1.js 

    app_module2 = require('AppModule2'); 
    exports.func1 = function(req,res){ 

    // I want to know which the session context this code is running for 

    app_module2.func2(req,res); 

    } 

AppModule2.js 

    exports.func2 = function(req,res){ 

    // I want to know where the session context in which this code is running 

    } 
+1

Si calculó una manera de hacer esto, por favor, responde a su propia pregunta. –

Respuesta

8

Puede lograrlo usando Dominios: una nueva función de nodo 0.8. La idea es ejecutar cada solicitud en su propio dominio, proporcionando un espacio para los datos por solicitud. Puede acceder al dominio de la solicitud actual sin tener que pasarlo por encima a través de process.domain.

Aquí es un ejemplo de hacer las cosas de configuración para trabajar con expreso: How to use Node.js 0.8.x domains with express?

Tenga en cuenta que, en general, los dominios son algo experimental y process.domain en particular, no está documentada (aunque al parecer no va a desaparecer en 0,8 y no hay alguna discusión sobre hacerlo permanente). Sugiero seguir sus recomendaciones y agregar una propiedad específica de la aplicación a process.domain.data.

https://github.com/joyent/node/issues/3733

https://groups.google.com/d/msg/nodejs-dev/gBpJeQr0fWM/-y7fzzRMYBcJ

0

dado que está utilizando Express, puede obtener la sesión adjunta a cada solicitud. La implementación es el siguiente:

var express = require('express'); 
var app = express.createServer(); 
app.configure('development', function() { 
    app.use(express.cookieParser()); 
    app.use(express.session({secret: 'foo', key: 'express.sid'})); 
}); 

A continuación, a cada solicitud, puede acceder sesión de la siguiente manera:

app.get('/your/path', function(req, res) { 
    console.log(req.session); 
}); 

Asumo que quiere tener algún tipo de identificador único para cada sesión para que pueda rastrear su contexto. SessionID se puede encontrar en la cookie 'express.sid' que estamos configurando para cada sesión.

app.get('/your/path', function(req, res) { 
    console.log(req.cookies['express.sid']); 
}); 

Así que, básicamente, que no tiene que hacer nada más que añadir analizador galleta y activar las sesiones para su aplicación expresa y luego, cuando se pasa la solicitud a estas funciones, se puede reconocer el identificador de sesión. DEBE pasar la solicitud, sin embargo, no puede construir un sistema donde solo conoce la sesión porque está escribiendo un servidor y la sesión está disponible a pedido.

+2

Bueno, está utilizando req como operador para pasar datos de contexto de ejecución a lo largo. Eso no es lo que estoy buscando. En un nivel más general, estoy buscando reemplazar argumentos en funciones por completo y tener nombres constantes en los archivos que, cuando se usan, apuntan al objeto correcto. Por lo tanto, si realizo una solicitud en cualquier lugar de los archivos, sería correcto req object, ya que se hubiera transmitido automáticamente – Raks

+0

Bueno, en lugar de escribir todo el sistema para eso, debe usar https://github.com/dwbutler/express -en-ferrocarril – instinctious

+2

@Raks aquí el problema es que está confundiendo el concepto de por archivo o global con solicitud. En el nodo, y en la red basada en eventos en general, la solicitud es el contexto. De lo contrario, no hay forma de distinguir qué sesión (una construcción artificial) está haciendo referencia y obtiene carreras. El nodo no es PHP ni Rails, el intérprete completo sobrevive entre las solicitudes, al igual que el alcance global. –

0

Lo que hace express, y la práctica común para construir una pila http en node.js es usar middleware http para "mejorar" o agregar funcionalidad a los objetos de solicitud y respuesta que entran en la devolución de llamada desde su servidor. Es muy simple y directo.

module.exports = function(req, res, next) { 
    req.session = require('my-session-lib'); 
    next(); 
}; 

req y res se pasan automáticamente a su manejador, y desde su usted tendrá que mantener a disposición de las capas apropiadas de su arquitectura. En su ejemplo, está disponible de esta manera:

AppModule2.js

exports.func2 = function(req,res){ 

    // I want to know where the session context in which this code is running 
    req.session; // <== right here 

} 
+3

Observará que está pasando la solicitud y la respuesta aquí. El OP no necesitaba pasar esas cosas en cada módulo. –

0

Nodetime es una herramienta de perfilado que hace internamente lo que estás tratando de hacer.Proporciona una función que instrumenta su código de tal manera que las llamadas resultantes de una solicitud HTTP particular están asociadas a esa solicitud. Por ejemplo, entiende cuánto tiempo pasó una solicitud en Mongo, Redis o MySQL. Echa un vistazo al video en el sitio para ver lo que quiero decir http://vimeo.com/39524802.

La biblioteca agrega sondas a varios módulos. Sin embargo, no he podido ver cómo se transmite exactamente el contexto (url) entre ellos. Con suerte, alguien puede resolver esto y publicar una explicación.

EDITAR: Lo siento, creo que esto fue un baza. Nodetime usa el seguimiento de pila para asociar llamadas entre sí. Los resultados que presenta son agregados en potencialmente muchas llamadas a la misma URL, por lo que esta no es una solución para el problema de OP.

Cuestiones relacionadas