2015-04-03 5 views
2

Я использую waterlock для sails.js для управления пользователями. Я хочу, чтобы иметь уникальное имя, так я это в моем 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 выглядит следующим образом:

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}); 
     } 
     }); 
    } 
    }); 

Очевидно, что я хочу, чтобы создание пользователя терпило неудачу, когда один с тем же идентификатором уже существует. Однако создание пользователя работает и создание auth не удается из-за уникального ограничения на имя пользователя. Но как только это не удается, у меня уже есть два пользователя с одинаковым идентификатором в моей базе данных, без привязки к нему. Почему это происходит? Я использую узел v0.12.1, паруса 0.11 и waterlock 0.14. Адаптером, который я использую, является встроенный парус-диск с {migrate: "alter"}. Еще одна странная вещь: когда я перезапускаю паруса, он спрашивает меня, следует ли удалять дубликаты в пользовательской таблице. Почему он распознает их тогда, но не тогда, когда я создаю пользователя? Благодарим за помощь, Alexander

+0

Я думал, что они были уникальными по умолчанию? Парусный gitter может быть хорошим местом, чтобы поболтать об этом: https://gitter.im/balderdashy/sails. –

+0

Да, primaryKeys должен быть уникальным, я просто добавил «unique: true», чтобы проверить, что это что-то меняет ... – AlexanderF

ответ

1

Возможно, вам нужно добавить свойство migrate: 'drop' для каждой модели, чтобы перезагрузить обе модели. Протестируйте один раз, а затем удалите свойство.

+0

Привет, я пробовал это, к сожалению, это не сработало. Когда я устанавливаю переход на «падение» ватерлинии, похоже, не создает никаких индексов и, следовательно, вообще не применяет уникальные ограничения. – AlexanderF

+0

Используете ли вы базу данных или локальный диск? –

+0

Привет, Я использую адаптер парусов. Этот адаптер ранее не поддерживал проверки уникальности, но эта функция была добавлена ​​недавно. – AlexanderF

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 
    } 
    } 
}; 

И ответ, если ERR:

{ 
    "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'" 
     } 
    ] 
    } 
} 
Смежные вопросы