Пишу чат на node.js. Авторизацию делаю так:
Вводим логин и пароль. Если есть такие, то пускаем. Если нет, то регистрируем и пускаем.
Сложные проверки пока пропустим. И вот что в итоге имеем. Регистрация срабатывает только при первой попытке. То есть открываем страницу, вводим от балды данные в форму и клацаем Enter.
Все, зарегистрировались, отлично. Обновляем страницу (при этом localstorage очищается. Это вместо кнопки Выход) и пробуем зарегистрироваться или войти с нашим логином - и тут нода падает с ошибкой.
Привожу функцию создания пользователя:
function genSessionKey(){
var s ='';
var abd ='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
var aL = abd.length;
while(s.length < 30){
s += abd[Math.random() * aL|0];
}
var hash = SHA512(s).toString();
return hash;
}
// создаем пользователя в БД
function createUser(usr, callback) {
/**
* КАКАЯ-ТО ХУЙНЯ С МЕТОДОМ SAVE
*/
var usver = new User(usr);
var ssid = genSessionKey(); // <- генерируется нормально
usver.save({
login: usr.login,
password: SHA512(usr.password).toString(),
s_key: ssid // <- в БД эта строка не попадает. Даже ключ s_key не создается
}, function (err, ussr) {
if (err) {
throw err;
}
// не запрашиваем авторизацию, пускаем сразу
callback(true, ussr);
});
}
***********************************************
Почему у меня s_key ключ не пишется - я разобрался )) Олень потомучто. А вот падение с ошибкой до сих пор тайна...
***********************************************
Модель для создания пользователя с помощью mongoose:
var UserSchema = new Schema({
login: { type: String, required: true, index: false, unique: true, validate: /[\da-zA-Z]/ },
password: { type: String, required: true },
color: { type: String, default: config.get('default_color') },
role: { type: Number, min: 0, max: 2, default: 0 },
avatar: { type: String, default: config.get('default_avatar') },
timestamp: { type: Date, default: TimeStamp.ISOget },
lastlogin: { type: Date, default: TimeStamp.ISOget },
online: { type: Boolean, default: true },
s_key: { type: String },
isBanned: { type: Number, min: 0, max: 1, default: 0 },
gender: { type: Number, min: 0, max: 2, default: 0 }
});
Ошибка с которой падает нода:
D:\NODEjs\projects\AppChat\node_modules\mongodb\lib\utils.js:98
process.nextTick(function() { throw err; });
^
MongoError: E11000 duplicate key error collection: AppChat.users index: ssid_1 dup key: { : null }
at Function.MongoError.create (D:\NODEjs\projects\AppChat\node_modules\mongodb\node_modules\mongodb-core\lib\error.js:31:11)
at toError (D:\NODEjs\projects\AppChat\node_modules\mongodb\lib\utils.js:114:22)
at D:\NODEjs\projects\AppChat\node_modules\mongodb\lib\collection.js:597:23
at handleCallback (D:\NODEjs\projects\AppChat\node_modules\mongodb\lib\utils.js:96:12)
at D:\NODEjs\projects\AppChat\node_modules\mongodb\lib\bulk\unordered.js:470:9
at handleCallback (D:\NODEjs\projects\AppChat\node_modules\mongodb\lib\utils.js:96:12)
at resultHandler (D:\NODEjs\projects\AppChat\node_modules\mongodb\lib\bulk\unordered.js:417:5)
at D:\NODEjs\projects\AppChat\node_modules\mongodb\node_modules\mongodb-core\lib\topologies\server.js:780:13
at Callbacks.emit (D:\NODEjs\projects\AppChat\node_modules\mongodb\node_modules\mongodb-core\lib\topologies\server.js:95:3)
at null.messageHandler (D:\NODEjs\projects\AppChat\node_modules\mongodb\node_modules\mongodb-core\lib\topologies\server.js:249:23)
at Socket.<anonymous> (D:\NODEjs\projects\AppChat\node_modules\mongodb\node_modules\mongodb-core\lib\connection\connection.js:265:22)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Socket.Readable.push (_stream_readable.js:110:10)
at TCP.onread (net.js:523:20)