2016-05-25 43 views
-1

平均堆叠/的NodeJS /猫鼬的应用程序,我有这样的代码:警告:。然后()只节选功能

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 <[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); 
 

 
    }); 
 
}

当我运行它,我得到一个错误: 警告:。那么()只节选功能,但传递:[对象未定义]

我应该在sendEmail,以便它与工作。然后改变() ?

+2

您需要传递一个返回Promise的函数,我猜。 –

+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; 
}); 

编辑注意到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

谢谢,很好的解释! –