2016-05-25 8 views
-1

in mittleren Stapel/NodeJS/Mungo app, ich habe diesen Code:Achtung: .then() nur excepts Funktionen

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

die Funktion sendmail wie folgt aussieht:

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

 
    }); 
 
}

Wenn ich es ausführe, bekomme ich einen Fehler: Warnung: .then() nur Funktionen auskommen aber wurde übergeben: [object Undefined]

was soll ich in sendEmail ändern, damit es mit .then() funktioniert ?

+2

Sie müssen eine Funktion übergeben, die ein Versprechen zurückgibt, denke ich. –

+0

danke @trincot, das funktioniert, aber dann das Spinnrad nicht aufhören ... sieht aus wie etwas nicht richtig beendet wurde. –

Antwort

0

Weil sendMail supports promises, kann es als dies so einfach sein:

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

Wenn Sie die Protokollierung beibehalten möchten, ersetzen Sie die letzte Zeile mit diesem:

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

EDIT: Ich habe bemerkte das body Argument, das ich vermute, kann das Ergebnis von saveUpdates(req.body)) sein. Wenn ja, müssen Sie auch Ihre Versprechens-Kette ein wenig umstrukturieren:

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

es funktioniert. nicht zu fassen! aber wie bekommt sendEmail den param? ist es immer das Ergebnis der vorherigen Funktion? –

+0

Der Parameter ist der Wert, der vom vorherigen '.then()' Schritt in der Kette übergeben wird (das ist im Grunde, wie korrekte Versprechensketten funktionieren). Es ist ähnlich wie '.then (Funktion (Körper) {zurück sendEmail (Körper)})' – robertklep

+0

Danke, tolle Erklärung! –

Verwandte Themen