【问题标题】:Writing MySQL Node.js models using node-mysql使用 node-mysql 编写 MySQL Node.js 模型
【发布时间】:2012-01-13 10:23:10
【问题描述】:

我正在尝试寻找一些使用 node-mysql 编写 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;

对此的任何批评或改进都会很棒。谢谢!

【问题讨论】:

  • 为什么不应该对第一种方法使用对象说明符
  • 就像您使用 module.exports 分隔事物的方式一样。 2年多了,今天你是如何改进的?请与我们分享我真的很感兴趣可乐我喜欢任何看起来像 orm 的东西

标签: mysql node.js models


【解决方案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 对象有一个帖子数组是很诱人的。现在,如果您更改此帖子数组,您必须记住将更改后的用户保存到数据库中。我一直忘记,所以我停止使用实例。

    【讨论】:

    • "create" 是一个 javascript 对象属性,您正在重载它:)。反正我喜欢这种模式。
    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-23
      • 2014-06-29
      • 1970-01-01
      • 2018-06-03
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      相关资源
      最近更新 更多