Quiero crear módulos para estructurar mi aplicación NodeJS, pero estoy un poco perdido, y no he encontrado nada (con horas de búsqueda) que sea completamente definitivo sobre el tema .Estructurando un módulo NodeJS - variables y métodos
decir te gustaría crear un módulo de "usuario", de la que puede crear nuevos usuarios en mi código usando algo como:
var newUser = new User();
Idealmente, me requiero mi módulo en la parte superior de mi código usando algo como:
var User = require('../lib/user');
Esto funciona genial. La pregunta es, ¿cómo debería estructurar el módulo de usuario? ¿Es la siguiente la mejor manera?
module.exports = function User() {
var authorized = false;
var username = undefined;
var password = undefined;
var statistics = undefined;
this.authorized = function() {
return authorized;
}
this.username = function() {
return username;
}
this.statistics = function() {
return statistics;
}
}
estoy escribiendo captadores y definidores de mis diversas variables de módulo, lo que me permite ocultar las cosas que no quiero para acceder accidentalmente de otro código. Sin embargo, lo he hecho de esta manera antes:
function User() {
this.authStatus = false;
this.email;
this.displayName;
this.inSession;
}
User.prototype.isAuthenticated = function() {
return(this.authStatus && this.email && this.displayName)
}
User.prototype.isInSession = function() {
return(this.inSession && this.isAuthenticated());
}
exports.User = User;
Esto también funciona, con una advertencia; No he encontrado una forma de acceder a las propiedades del usuario desde dentro de los cierres. Si mi comprensión es correcta, con la segunda implementación, no puedo. Esto significa que si necesito entregar una función a una biblioteca de db como una devolución de llamada para editar las propiedades del usuario, no puedo. Eso sería algo como:
User.prototype.login = function() {
db.doDbStuff('get user data query', function(_error, _result) {
this.username = _result[0].name; //this code will not work
});
}
El código no funciona, a mi entender, debido a que la palabra "this" está dentro del alcance del cierre, no el usuario. Incluso si el código fuera colocado dentro de la función de Usuario:
function User() {
this.login = function() { //you know
No funcionaría.
Supongo que mi pregunta es, ¿cuál es la mejor solución para este problema? ¿Es el método que presenté en el primer bloque de código? Eso parece bastante engorroso y sucio y propenso a una colisión variable. Estoy asustado.
¡Gracias de antemano!
Si algo de esto no tiene sentido, me disculpo de antemano, acabo de tomar algunos medicamentos para el dolor para mis muelas del juicio y me siento un poco liviano y funky. –
Parece sangrar más en el ámbito de la arquitectura javascript en lugar de hacer con node.js en general. http://speakerdeck.com/u/addyosmani/p/scaling-your-javascript-applications y http://www.slideshare.net/SlexAxton/superclassy-inheritance-in-javascript son bastante buenos. – balupton
Vale la pena señalar que en ambos ejemplos las variables NO SON privadas. Deberías echarle un vistazo a: http://javascript.crockford.com/private.html –