2011-12-05 18 views
9

Estoy tratando de encontrar algunas buenas prácticas para escribir modelos MySQL usando node-mysql.Escribiendo modelos MySQL Node.js usando node-mysql

Esto es lo que tengo hasta ahora:

var client = app.settings.client; // Client is set in Express settings 

var table = 'users'; 

var User = function() { 

} 

// Create the user with data from Facebook 
User.prototype.createFromFacebook = function (name, first_name, last_name, email, location, gender, facebookId, facebookToken, callback) { 
    client.query(
    'INSERT INTO ' + table + 
    ' SET name = ?, first_name = ?, last_name = ?, email = ?, location = ?,' + 
    ' gender = ?, facebook_id = ?, facebook_token = ?', 
    [ name, first_name, last_name, email, location, gender, facebookId, facebookToken ], 
    function selectCb(err, results, fields) { 
     if(err) { 
     callback(err); 
     } else { 
     callback(null, results); 
     } 
    } 
); 
} 

// Get user with just their email address 
User.prototype.getByEmail = function (email, callback) { 
    client.query(
    'SELECT * FROM ' + table + 
    ' WHERE email = ?', 
    [ email ], 
    function selectCb(err, results, fields) { 
     if(err) { 
     callback(err); 
     } else { 
     callback(null, results); 
     } 
    } 
); 
} 
module.exports = User; 

Cualquier críticas o mejoras en esto sería impresionante. ¡Gracias!

+0

por qué no se debe usar el especificador de objetos para el primer método –

+0

, como la forma en que separe las cosas con module.exports. Pasaron más de 2 años, así que hoy ¿cómo lo mejoras? Por favor, comparte con nosotros soy realmente interesado cok me gusta todo lo que parece un orm –

+0

Por ejemplo, https://github.com/michalkow/node-mysql-model –

Respuesta

0

Su forma se ve bien.

Asegúrese de que cuando se produce un error su declaración:

if (err) { 
return callback(err) 
} 

o simplemente utiliza el que se le parezca que está haciendo.

Sólo por el bien de la crítica, esto es lo que hago:

var db = require(__dirname + '/myDatabaseInstance.js'); 

var create = function (vals, next) { 
    db.query('Insert INTO users SET ?', vals, next); 
}; 

var load = function (selector, next) { 
db.query('SELECT * FROM users WHERE ?', selector, function (err, vals) { 
    if(err) { 
    return next(err); 
    } 
    //at this point you could return a user object 
    //next(new User(vals[0])); 
    //or just return the array. 
    next(null, vals); 
}); 
}; 
module.exports = create; 
module.exports = load; 

llamo esta manera

var User = require(__dirname + '/user.js'); 
User.load({'id' : 1}, function (err, vals) { 
    if (err) throw err; 
    console.log(vals); 
}); 

Mi preferencia personal es no utilizar las instancias de mis modelos. Descubrí que comenzó a complicarse cuando tenía relaciones.

Por ejemplo, supongamos que tiene un blog con publicaciones almacenadas en una tabla separada relacionada con el usuario. Es tentador hacer que el objeto Usuario tenga una matriz de publicaciones. Ahora, si cambia esta matriz de publicaciones, debe recordar guardar el Usuario cambiado en la base de datos. Me olvidaba, así que dejé de usar instancias.

+0

"crear" es una propiedad de objeto javascript y lo está sobrecargando:) Me gusta el patrón de todos modos. –

0
Create model name abc.js with following code: 
var mysqlModel = require('mysql-model'); 
var MyAppModel = mysqlModel.createConnection({ 
    host: 'localhost', 
    user: 'ghgh', 
    password: 'gfhgfh', 
    database: 'gfhgh', 
}); 


movie = new MyAppModel({tableName: "users"}); 



Now use this as following : 
var abc = require(__dirname+'/routes/abc') 
movie.find('id','all', function(err, rows) { 
//console.log(rows) 
}) 
movie.query("SELECT * from users", function(err, rows) { 
}); 
var value ={'name': "value3"}; 
movie.save(value); 
Cuestiones relacionadas