2015-01-24 2 views
0

Mongoose Model.save берет на ~ 1,5 + секунд, чтобы закончить, и если метод, который я пользователь Model.collection.insert вместо его только ~ 50мсMongoose .save звонок очень медленно

Второе решение, если я не ошибка ошибочна, потому что она использует собственный драйвер mongoDb. Я попытался использовать console.time, чтобы изолировать, где происходит задержка, и это происходит непосредственно перед тем, как вызывается функция Model.prototype.save, которая действительно странная.

Аутентификация auth.username проиндексирована так, что это не должно вызывать медлительность.

Ниже приведен пример схемы модели и как я вызываю новую модель.

Я использую 3.20.0 mongoose и 2.6.4 of mongoDB.

var userSchema = new Schema({ 

active: { type: Boolean, default: true }, 

player_id: ObjectId, 
player: mongoose.Schema.Types.Mixed, 

auth: { 
    token: { type: String, required: true, default: 'temp' }, 
    username: { type: String, required: true, trim: true, lowercase: true, index: { unique: true } }, 
    password: { type: String, required: true }, 
    login_attempts: { type: Number, required: true, default: 0 }, 
    locked_until: { type: Number } , 
}, 

contact: { 
    first_name: String, 
    last_name: String, 
    nick_name: String, 
    email: { type: String, required: true, trim: true, lowercase: true, index: { unique: true } }, 
    phone: { type: String, required: false, trim: true, index: { unique: true, sparse: true } } 
}, 

},{collection: 'user' }); 



-v-v-v-v-v-v-v-v-v-v-v-v- 



var mongoose  = require('mongoose'), 
    User   = mongoose.model('User'); 

var newUser = new User(data); 

newUser.save(function (err) { 

    if(err) { return cb(err); } 
    // Call takes ~1.5+ seconds 

}); 

User.collection.insert(data, function(err, user){ 

    if(err) { return cb(err); } 
    // Call takes ~50ms 

}); 
+0

Как вы на самом деле синхронизации это? Фактически вы используете исходное соединение с базой данных? –

+0

Время ответа на запрос POST составляет 1,5 + секунды, если это было начальное соединение с БД, повторение одного и того же запроса сразу после этого было бы неплохо, но все равно. Я использую console.time ('label')> console.timeEnd ('label'), чтобы проверить, где находится задержка. – Labithiotis

+0

Это не очень информативно. Вас задали конкретный вопрос. Измените свой вопрос, чтобы точно показать **, как вы измеряете заявленный ответ. Это дает нам кое-что для работы, чего нет в вашем нынешнем вопросе. –

ответ

2

Причиной был «presave» вызов и установка коэффициента соли до высокой:

userSchema.pre('save', function(next) { 

// only hash the password if it has been modified (or is new) 
if (!this.isModified('auth.password')) return next(); 

var user = this; 

// generate a salt 
bcrypt.genSalt(14 /*<< Setting to 14 from 10 caused call to be 10x slower */, function(err, salt) { 
    if (err) return next(err); 

    // hash the password using our new salt 
    bcrypt.hash(user.auth.password, salt, function (err, hash) { 
     if (err) return next(err); 

     // set the hashed password back on our user document 
     user.auth.password = hash; 
     next(); 
    }); 
}); 

}); 
+0

это убило меня! Благодаря! – orourkedd

+0

Я использовал 'genSalt (16)', и операции внезапно запустили '~ 20000ms'! Это простое изменение значения 'genSalt' отвечало за ** огромную ** разницу во времени в db для меня. Спасибо, что указали! –

Смежные вопросы