Я пытаюсь найти хорошие практики для написания моделей MySQL с помощью node-mysql
.
Вот что я до сих пор:
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;
Любые критические замечания или улучшения по этому вопросу были бы удивительными. Спасибо!
Ответ 1
В качестве улучшения вы можете реорганизовать свой код
- Источник данныхобъект для подключения к БД
const db = require(__dirname + '/myDatabaseInstance.js');
- Создать модель UserSchema user.js определяет поля, тип данных, правила проверки и т.д.
user.schema.js
{
"ID" : {
"field" : "id",
"type" : 'integer',
"validation_rules" : "onlyInteger"
},
"name" : {
"field" : "name",
"type" : "string",
"validation_rules": "usernameregex"
}
}
- Создайте Controller.js, где вы можете использовать методы findAll, findById, создавать, обновлять, удалять, искать API.
class _controller {
constructor(object, model_schema) {
this._object = object;
this._model_schema = model_schema;
}
setId(_id) {
this.id = _id;
}
validateRules(validation_rules) {
return new Promise((resolve, reject) => {
let error = {};
let validation = new Validator(this._object, validation_rules);
if (validation.fails()) {
error.type = "validation";
error.errors = validation.errors.errors;
reject(error);
} else {
resolve(true);
}
});
};
create() {
return new Promise((resolve, reject) => {
let response = {};
let error = {};
this.validation_rules=
UserSchema.getRules(this._model_schema).get_validation_rules;
this
.validateRules(this.validation_rules )
.then(validation_result => {
db.insert(this.table, this._object)
.then(result => {
response.status = 201;
resolve(response);
});
})
});
}
})
- Создайте user.js, который распространяется на обычный controller.js, используя схему пользователя
class user extends _controller {
constructor(object) {
super(object, "user_schema");
this.object = object;
}
}
Вы можете добавить новые функции в код user.js.
Ответ 2
Ваш способ выглядит просто отлично.
Убедитесь, что когда вы получите сообщение об ошибке:
if (err) {
return callback(err)
}
или просто используйте else, как вы делаете.
Просто ради критики, вот что я делаю:
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;
Я называю это таким образом
var User = require(__dirname + '/user.js');
User.load({'id' : 1}, function (err, vals) {
if (err) throw err;
console.log(vals);
});
Мои личные предпочтения - не использовать экземпляры для моих моделей. Я обнаружил, что он начал запутываться, когда у меня были отношения.
Например, скажем, у вас есть блог с сообщениями, которые хранятся в отдельной таблице, связанной с пользователем. Заманчиво заставить объект User иметь массив сообщений. Теперь, если вы измените этот массив сообщений, вам нужно запомнить сохранение измененного пользователя в базе данных. Я продолжал забывать, поэтому я просто прекратил использовать экземпляры.
Ответ 3
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);