yarkov
@yarkov
Помог ответ? Отметь решением.

Регистрация в чате. Магия?

Пишу чат на 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)
  • Вопрос задан
  • 361 просмотр
Решения вопроса 1
@lega
Монга не дает создать дубль документа,
судя по ошибке в коллекции поставлена уникальность на поле "ssid", а вы его не передаете и оно пишется как пустое, а т.к. поле уникальное то 2 пустых значения в этом поле нельзя.

Либо удалите уникальный индекс по этому полю, либо пишите в это поле уникальное значение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы