【问题标题】:Validate nodejs model using classes使用类验证 nodejs 模型
【发布时间】:2021-11-05 19:42:05
【问题描述】:

我正在尝试使用 JavaScript 和 MySQL 为 NodeJS 应用程序创建模型。现在,我得到了使用构建器模式的提示,因为我的对象变得太大并且不可读。 因此,我创建了另一个类,并在构造函数中创建了一个基本类的实例,就像我在教程中看到的那样。

// Basic
class User {
    constructor(fname) {
        this.fname      = fname;
    };    
}

// Builder for the user class
module.exports = class UserBuilder {
    constructor(fname) {
        this.user = new User(fname);
    }

    setLname(lname) {
        this.user.lname = lname;
        return this;
    }

    setEmail(email) {
        this.user.email = email;
        return this;
    }

    setPassword(password) {
        this.user.password = password;
        return this;
    }

    setAge(age) {
        this.user.age = age;
        return this;
    }

    setGender(gender) {
        this.user.gender = gender;
        return this;
    }

    setAvatar(avatar) {
        this.user.avatar = avatar;
        return this;
    }

    setPhoneNumber(number) {
        this.user.number = number;
        return this;
    }

    build() {
        return this.user;
    }
}

我的第一个问题是:如何验证所有论点?某些参数不是必需的,isAdmin 应默认为 False。

为了检查这一点,我创建了一个基本实例来查看如何构建。

const user = require('./models/user.js');
const User = new user('bob').setAge(22).build();
console.log(User); 

我的第二个问题是如何在类中创建一个方法来编辑或删除对象并与数据库交互。还是应该在控制器中?

【问题讨论】:

    标签: javascript mysql node.js


    【解决方案1】:

    我可能在你的问题的某些部分没有理解你。但我试过了。 因此,通过添加更新的属性,这基本上使构建器类变得更小了。现在您只需要提供键和值即可向对象添加内容,而不是为其调用单独的方法。

    注意 - editremove 方法不需要调用 build返回基本用户类的方法。 您的所有问题都已在代码 cmets 中得到解答。

    /// Basic
    class User {
      constructor(fname) {
        this._validate(fname);
        this.fname = fname;
      }
    
      _validate(param) {
        //what ever you wanna check before adding into object
      }
    }
    
    // Builder for the user class
    class UserBuilder {
      constructor(fname) {
        this.user = new User(fname);
      }
    
      addSomething(key, value) {
        if (typeof key !== "string") {
          //throw "Key provided is not a string."
        }
        key = key.toLowerCase();
        if (key == "role") {
          this.user[key] = this.isAdmin();
          return this;
        }
    
        this.user[key] = value;
        return this;
      }
    
      isAdmin() {
        // your way to check if its admin.
        /**
         * if(admin == true) {
         *   return true;
         *  } else return false;
         */
      }
    
      edit(param, val) {
        if (!this.has(param)) {
          //throw
        } else {
          this.user[param] = val;
          //db operation to edit it.
        }
        return this.user;
      }
    
      /**
       * By delete Object I suppose delete a property.
       */
      remove(param) {
        if (!this.has(param)) {
          //throw
        } else {
          delete this.user[param];
          //db operation to remove it.
        }
        return this.user;
      }
    
      has(val) {
        return this.user[val] ? true : false;
      }
    
      build() {
        return this.user;
      }
    };
    
    const userr = new UserBuilder("Vox");
    console.log(userr.addSomething("age", 19).build());
    console.log(userr.edit("age", 21));
    console.log(userr.remove("age"));
    

    这是代码记录的内容。

    User { fname: 'Vox', age: 19 }
    User { fname: 'Vox', age: 21 }
    User { fname: 'Vox' }
    

    【讨论】:

      猜你喜欢
      • 2015-09-04
      • 2016-05-27
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多