2016-11-16 11 views
0

Я использую промежуточное программное обеспечение, которое обрабатывает логику для создания новых пользователей в db. Эта функция просто проверяет, существует ли почтовый адрес пользователя, если он не создает новый документ, иначе он просто отправит клиенту ошибку.Сеть ExpressJS обещает несколько раз вызвать функцию next()

Проблема в этой функции (ниже) является то, что следующая функция() промежуточного слоя вызывается дважды, когда пользователь электронной почты уже существует в БД

Я мог бы просто не цепи эти два обещания и просто использовать обещание внутри другого, но если у кого-то есть хороший образец для решения такого рода ошибок, возможно, мой код ошибочен, или я пропустил что-то о обещаниях.

create: function(req, res, next) { 

    // Check if email already exist 
    userDB.byEmail(req.body.email).then(function(doc) { 

     if (doc) { 
      res.setError('This email already exists', 409); 
      return next(); 
     } 

     // Return other Promise 
     return userDB.create(req.body); 

    }).then(function(doc) { 

     res.setResponse(doc, 200); 
     return next(); 

    }).catch(function(err) { 

     res.setError('Service seems to be unavailables', 503); 
     return next(); 
    }); 
}, 

Примечание: Я использую личные методы res.setError() или res.setResponse() , которые просто помочь мне управлять запрос состояния, то я использую res.send с следующей функцией промежуточного слоя

< спасибо, ребята 3

ответ

0

Когда вы return next() в .byEmail обратного вызова вы продолжающее обещание цепи, поэтому следующий .then, который делает res.setResponse(doc, 200), также заканчивается тем, что вызывается. Вам либо нужно сломать цепочку обещаний на throw ing, либо задать ответ в одном месте.

if (doc) { 
    const error = new Error('This email already exists'); 
    error.status = 409; 

    throw error; 
} 
// ... 
.catch(err => { 
    res.setError(err.message, err.status); 
    return next(); // you may not even want to do this in the case of errors 
}); 
+0

Спасибо за ваш ответ. Это то, что я думал. - Является ли это хорошим шаблоном для ошибок в этом плане в обещаниях? Я новичок в обещаниях, и я просто использовал шаблон nodeJS function (err, res), потому что callback не позволяет использовать try/catch, и поэтому использует throw Error –