2016-03-27 8 views
1

Я использую NodeJS и Mongoose для приложения, в котором есть пользователи. И у меня есть большое количество действий, которые сервер делает для определенного пользователя, в зависимости от запроса.Как уменьшить это дублирование кода в NodeJS/Mongoose

Это означает, что у меня есть этот конкретный фрагмент кода, появляющийся в большом количестве функций:

User.findOne({'email':req.user.email}, function (err, user) { 
if (err) { 
    console.log('err'); 
    res.send('Error'); 
} 
if(!user){ 
    console.log('err'); 
    res.send('Error'); 
} 

// do something with returned user 
user.data = .... 
... 

user.save(function(err) { 
    if(err) { 
    console.log('err'); 
    res.send('Error'); 
} 
else { 
    console.log('success'); 
    res.send('Success'); 
} 

}

Как вы можете видеть, есть много кода, который размножается. Измененный код - это часть «сделать что-то с возвращенным пользователем». Почти все остальное (сообщения об ошибках и т. Д.) Остаются такими же.

Итак, как я могу извлечь эту часть? Поскольку это работает на механизм обратного вызова, есть ли определенный способ достичь этого?

+5

Используйте ['.update()'] (http://mongoosejs.com/docs/api.html#model_Model.update) вместо этого для стартеров. Используя '.findOne()', тогда манипулирование и вызов '.save()' довольно плохой практики, которая является полосой пропускания, делая вещи медленными и обычно полными дыр, что приводит к проблемам параллелизма с обновлениями. Это более широкая проблема, но только разработка того, как правильно применять этот вызов, сэкономит много шаблонов, а также даст вам много других преимуществ. –

ответ

1

Один из способов - использовать обещания. Это предполагает поиск способа конвертировать Mongooose api для возврата обещаний вместо использования обратных вызовов. После этого, вы можете создать код, который будет следовать линиям

User.findOne(...) 
    .then((user) => { 

     // do something with the returned user 

     return user.save(); 
    }).then(() => { 
     console.log('success'); 
     res.send('Success'); 
    }).catch(() => { 
     console.log('err'); 
     res.send('Error'); 
    }); 

Обещания напоминают традиционное синхронные кодирования, где вы можете распространять ошибки сродни примерочные поймать блок и, таким образом, нуждаясь только одна ошибка обработки местоположения. Таким образом, вам не придется копировать строки console.log('err'); res.send('Error'); в нескольких местах.

Вы можете прочитать введение в Promises, например, в "Promises - A Gentle Introduction". Для части преобразования Mongoose в Promises может существовать существующий модуль для этого или другой подход, который используют API, чтобы не давать функцию обратного вызова в качестве последнего аргумента, а затем вместо этого возвращается Promise. К сожалению, у меня нет точных знаний в этом конкретном API Mongoose.