【问题标题】:Sails.js Waterlock - Unique usernameSails.js Waterlock - 唯一的用户名
【发布时间】:2015-04-03 23:02:06
【问题描述】:

我正在使用 waterlock forsails.js 来管理我的用户。我希望他们有一个唯一的用户名,所以我在我的 User.js 中有这个:

module.exports = {
  autoPk : false,
  attributes: require('waterlock').models.user.attributes({
    id : {
      type : "string",
      primaryKey : true,
      unique : true
    }
  }),

  beforeCreate: require('waterlock').models.user.beforeCreate,
  beforeUpdate: require('waterlock').models.user.beforeUpdate
};

我的 Auth.js 看起来像这样:

module.exports = {

  attributes: require('waterlock').models.auth.attributes({
    username : {
      type : "string",
      unique : true
    }
  }),

  beforeCreate: require('waterlock').models.auth.beforeCreate,
  beforeUpdate: require('waterlock').models.auth.beforeUpdate
};

我正在创建这样的用户:

auth = {
  username: params.username,
  password: params.password
};
userObj = {
  id: params.username
};

User.create(userObj)
  .exec(function (err, user) {
    if (err) {
      sails.log.error("USER: " + err);
      req.session.flash = {
        err: err
      };
      return res.json(err);//res.redirect('/user/create');
    } else {
      req.session.user = user;
      waterlock.engine.attachAuthToUser(auth, user, function (err) {
        if (err) {
          sails.log.error("AUTH: " + err);
          return res.json(err);
        } else {
          req.session.authenticated = true;
          return res.json({ok: true});
        }
      });
    }
  });

很明显,当具有相同 id 的用户已经存在时,我希望创建用户失败。但是,由于用户名的唯一约束,用户的创建工作并且身份验证的创建失败。但是一旦失败,我的数据库中已经有两个具有相同 ID 的用户,没有附加身份验证。为什么会这样?我正在使用节点 v0.12.1、sails 0.11 和 waterlock 0.14。我使用的适配器是带有 {migrate : "alter"} 的内置sails-disk。另一个奇怪的事情是:当我重新启动sails 时,它会询问我是否应该删除用户表中的重复项。为什么它会识别它们,但在我创建用户时却没有? 感谢您的帮助, 亚历山大

【问题讨论】:

  • 我认为默认情况下它们是独一无二的? Sails gitter 可能是个讨论这个问题的好地方:gitter.im/balderdashy/sails.
  • 是的,primaryKeys 应该是唯一的,我只是添加了“唯一:true”来检查是否有任何改变...

标签: node.js sails.js waterline waterlock


【解决方案1】:

也许您必须向每个模型添加属性 migrate : 'drop',以重新加载两个模型。测试一次,然后删除该属性。

【讨论】:

  • 嗨,我试过了,很遗憾没有用。当我将迁移设置为“drop”时,水线似乎没有创建任何索引,因此根本不强制执行唯一约束。
  • 您使用的是数据库还是本地磁盘?
  • 您好,我使用的是sails-disk 适配器。此适配器以前不支持唯一性检查,但最近添加了该功能。
【解决方案2】:

您是否需要指定它:

module.exports = {
  attributes: {
    username: {
        type: 'string',
        unique: true,
        required: true
    }
  }
};

您还可以使用自定义类型:

module.exports = {
  types: {
    size: function() {
        true
    }
  },
  attributes: {
    username: {
        type: 'string',
        unique: true,
        minLength: 4,
        macLength: 10,
        size: 10,
        required: true
    }
  }
};

如果出错则响应:

{
  "error": "E_VALIDATION",
  "status": 400,
  "summary": "2 attributes are invalid",
  "model": "User",
  "invalidAttributes": {
    "username": [
      {
        "rule": "string",
        "message": "`undefined` should be a string (instead of \"null\", which is a object)"
      },
      {
        "rule": "minLength",
        "message": "\"minLength\" validation rule failed for input: null"
      },
      {
        "rule": "required",
        "message": "\"required\" validation rule failed for input: null"
      }
    ],
    "password": [
      {
        "rule": "minLength",
        "message": "\"minLength\" validation rule failed for input: '123'"
      }
    ]
  }
}

【讨论】:

    猜你喜欢
    • 2015-07-08
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 2013-10-06
    • 2018-12-03
    • 2021-05-10
    相关资源
    最近更新 更多