【问题标题】:How can I set enum in my userSchema to have an empty default如何将我的 userSchema 中的枚举设置为空默认值
【发布时间】:2018-08-06 00:39:34
【问题描述】:

我目前正在为使用 MongoDB 作为数据库、ExpressJS 和 PassportJS 的项目编写注册表单,但是,我试图让用户能够选择角色,然后像这样在数据库中注册用户登录后重定向到正确的页面。

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const userSchema = new Schema({
    name: String,
    username: String,
    password: String,
    role: {
        type: String,
        enum: ['COMPANY', 'IRONHACKER', 'ADMIN'],
        default: 'IRONHACKER',
    },
    session: String,
    last_login: {
        type: Date,
        default: ""
    }
}, {
    timestamps: {
        createdAt: "created_at",
        updatedAt: "updated_at"
    },
});

const User = mongoose.model("User", userSchema);
module.exports = User;

默认情况下它有 3 个值,用户只能选择 2 个:IRONHACKER 和 COMPANY。

目前,它的行为有所不同,因为我将“IRONHACKER”设置为默认值,所以它始终是用户注册后得到的。

【问题讨论】:

  • 你能解释一下空虚的重要性吗?这样我就可以想象风景了。
  • 为空的重要性在于,如果我当前注册了一个用户,它会自动默认分配一个值,而不管他真正拥有的角色,无论是 IRONHACKER,这是一个学生档案和我正在寻找这个角色的主要行动是填写个人资料并寻找工作,另一个角色是 EMPLOYER,基本上是发布、删除和审查学生提交的公司。它们中的每一个都必须访问不同的页面,并且它们可以执行的操作会有所不同。
  • 所以我阅读了文档。请注意,枚举基本上是在字段中可以输入和不可以输入的验证规则。插入不存在的东西打破了这个规则。也许这不是办法,可能需要插入第四条规则。只使用数据库的规则。
  • 我明白你的意思,也许我必须使用不同的东西才能得到我期望的结果,因为即使我添加了第四条规则仍然不允许用户选择它的角色和记录在数据库中。
  • 基于此:github.com/Automattic/mongoose/issues/3044。你试过[null, 'COMPANY', 'IRONHACKER', 'ADMIN']default: null吗?或者只是default: null

标签: node.js mongodb express mongoose passport.js


【解决方案1】:

我找到了解决方案,而且效果非常好!

我保持 userSchema 不变

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const userSchema = new Schema({
    name: String,
    username: String,
    password: String,
    role: {
        type: String,
        enum: ['COMPANY', 'IRONHACKER', 'ADMIN'],
        default: 'IRONHACKER',
    },
    session: String,
    last_login: {
        type: Date,
        default: ""
    }
}, {
    timestamps: {
        createdAt: "created_at",
        updatedAt: "updated_at"
    },
});

const User = mongoose.model("User", userSchema);
module.exports = User;

而我唯一修改的是注册表单配置:(注册表没有此功能,仅用于测试目的)。

    <h2>Signup</h2>

<form action="/signup" method="POST" id="form-container">
  <label for="name">Full Name</label>
  <input id="name" type="name" name="name" placeholder="Provide your Name">
  <br>
  <br>
  <label for="username">Username</label>
  <input id="username" type="text" name="username" placeholder="Set Username">
  <br>
  <br>
  <label for="password">Password</label>
  <input id="password" type="password" name="password" placeholder="Set a password"> 
  <br>
  <br>
  <select name="role" id="role">
    <option value="" disabled="disabled" selected="selected">--Please choose an option--</option>
    <option value="IRONHACKER">Ironhacker</option>
    <option value="COMPANY">Employer</option>
    <option value="ADMIN">Administrator</option>
  </select>
  {{#if message}}
    <div class="error-message">{{ message }}</div>
  {{/if}}
  <br>
  <br>
  <button>Create account</button>

  <p class="account-message">
    Do you already have an account?
    <a href="/login">Login</a>
  </p>
</form>

所以它现在可以检测到角色并且用户被正确地赋予了角色和权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 2021-10-16
    • 2011-07-23
    • 2011-05-19
    • 2014-11-30
    • 2011-10-27
    • 2021-01-26
    • 2012-07-05
    相关资源
    最近更新 更多