Sails.js Waterlock - 唯一的用户名

时间:2015-04-03 23:02:07

标签: node.js sails.js waterline waterlock

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您需要指定它:

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'"
      }
    ]
  }
}