Создание MySQL Node.js моделей с использованием node -mysql

Я пытаюсь найти хорошие практики для написания моделей 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

В качестве улучшения вы можете реорганизовать свой код

  1. Источник данныхобъект для подключения к БД
const db = require(__dirname + '/myDatabaseInstance.js');

  1. Создать модель UserSchema user.js определяет поля, тип данных, правила проверки и т.д.

user.schema.js

{
 "ID" : {
      "field" : "id",
       "type" : 'integer',
       "validation_rules" : "onlyInteger"     
  },
"name" : {
      "field" : "name",
      "type" : "string",
      "validation_rules": "usernameregex"   
 }
}

  1. Создайте 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);
                            });

                    })

            });
        }
})
  1. Создайте 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);