2016-05-25 16 views
-1

в среднем приложение стек/nodejs/мангустов, у меня есть этот код:Предупреждение: .then() только excepts функции

User.findByIdAsync(req.params.id) 
 
    .then(handleEntityNotFound(res)) 
 
    .then(saveUpdates(req.body)) 
 
    .then(sendEmail()) // this is my addition 
 
    .then(respondWithoutResult(res)) 
 
    .catch(handleError(res));

функция Sendmail выглядит следующим образом:

function sendEmail(body){ 
 
    var mailOptions = { 
 
    from: 'Excited User <admi[email protected]>', 
 
    to: '[email protected]', 
 
    subject: 'Hello', 
 
    text: 'body text here' 
 
    }; 
 

 
    var smtpConfig = { 
 
    host: config.mailgun.smtp_host, 
 
    port: 465, 
 
    secure: true, 
 
    auth: { 
 
     user: config.mailgun.smtp_user, 
 
     pass: config.mailgun.smtp_pass 
 
     } 
 
    }; 
 

 
    
 
    var transporter = nodemailer.createTransport(smtpConfig); 
 
    transporter.sendMail(mailOptions, function(error, info){ 
 
     if(error){ 
 
      return console.log(error); 
 
     } 
 
     console.log('Message sent: ' + info.response); 
 

 
    }); 
 
}

, когда я запускаю его, я получаю сообщение об ошибке: Предупреждение: .then() только за исключением функций, но передано: [объект Undefined]

Что я должен изменить в sendEmail, чтобы он работал с .then() ?

+2

Вам нужно передать функцию, которая возвращает обещание, я думаю. –

+0

спасибо @trincot, что работает, но тогда вращающееся колесо не останавливается ... похоже, что что-то не закончилось правильно. –

ответ

0

Поскольку sendMail supports promises, это может быть так просто, как это:

function sendEmail(body) { 
    var mailOptions = { 
    from: 'Excited User <[email protected]>', 
    to: '[email protected]', 
    subject: 'Hello', 
    text: 'body text here' 
    }; 

    var smtpConfig = { 
    host: config.mailgun.smtp_host, 
    port: 465, 
    secure: true, 
    auth: { 
     user: config.mailgun.smtp_user, 
     pass: config.mailgun.smtp_pass 
    } 
    }; 

    var transporter = nodemailer.createTransport(smtpConfig); 

    // Return the promise here. 
    return transporter.sendMail(mailOptions); 
} 

Если вы хотите сохранить запись в журнал, замените последнюю строку с этим:

return transporter.sendMail(mailOptions).then(function(info) { 
    console.log('Message sent: ' + info.response); 
    return info; 
}, function(error) { 
    console.log(error); 
    throw error; 
}); 

EDIT: Я просто заметил аргумент body, который, как я предполагаю, может быть результатом saveUpdates(req.body)). Если это так, вам также необходимо немного перестроить свою цепочку обещаний:

User.findByIdAsync(req.params.id) 
    .then(handleEntityNotFound(res)) 
    .then(saveUpdates(req.body)) 
    .then(sendEmail) 
    .then(respondWithoutResult(res)) 
    .catch(handleError(res)); 
+0

он работает. невероятно! но как sendEmail получает параметр? всегда ли это результат предыдущей функции? –

+0

Параметр - это значение, которое передается из предыдущего шага '.then()' в цепочке (в основном это работает с правильными цепочками обещаний). Это похоже на '.then (function (body) {return sendEmail (body)})' – robertklep

+0

спасибо, большое объяснение! –