2015-04-03 61 views
2

我正在使用sail.js的locklock来管理我的用户。我希望他们有一个唯一的用户名,所以我有这个在我的user.js的:Sails.js Waterlock - 唯一的用户名

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看起来是这样的:

​​

而且我创建的用户是这样的:

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时,它会询问我是否应删除用户表中的重复项。为什么它会识别它们,但是当我创建用户时不能识别它们? 感谢您的帮助, 亚历山大

+0

我认为他们默认情况下是唯一的?帆船可能是聊天的好地方:https://gitter.im/balderdashy/sails。 – 2015-04-03 23:25:15

+0

是的,primaryKeys应该是唯一的,我只是添加了“unique:true”来检查是否改变了任何东西... – AlexanderF 2015-04-04 00:41:31

回答

1

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

+0

嗨,我试过了,它不幸没有工作。当我设置迁移到“下降”水线似乎没有创建任何指标,因此并没有强制执行独特的约束。 – AlexanderF 2015-04-07 06:30:25

+0

您使用的是数据库还是本地磁盘? – 2015-04-07 06:35:36

+0

嗨,我使用风帆磁盘适配器。此适配器以前不支持唯一性检查,但最近添加了该功能。 – AlexanderF 2015-04-07 07:05:00

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