Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node JS + AWS Promise Triggered Twice

AWS = require('aws-sdk');
AWS.config.region = 'eu-west-1';
ses = new AWS.SES();

var params = {};

return ses.sendEmail(params, function (err, data) {
    console.log('----->sending email')
}).promise().then((data) => {
    console.log('---->sending promise')
}).catch((err) => {
    console.log('----->am in error')
    console.log(err)
})

Can someone help my above code promise is triggered twice.

I should get below

----->sending email

---->sending promise

But i got

----->sending email

---->sending promise

----->sending email

like image 215
Manivannan Guru Avatar asked Dec 04 '22 21:12

Manivannan Guru


1 Answers

It looks like you are providing both a callback function and using the promise approach. Effectively, this means that you have two different functions that execute when the request is done. Choose one of the following:

You can use the promise approach, with then and catch.

function send(params) {
    ses.sendEmail(params).promise().then((data) => {
        console.log('Email was sent')
    }).catch((err) => {
        console.log('There was an error')
    })
}

You can use promise with async/await. Make sure you add the async keyword to your function header. Make sure your Node runtime supports async/await or that you code is transpiled to whatever Node version you are using.

async function send(params) {
    try {
        const data = await ses.sendEmail(params).promise();
        console.log('Email was sent')
    } catch(err) {
        console.log('There was an error')
    }
}

Finally, you could use the callback approach:

function send(params) {
    ses.sendEmail(params, function(err, data) {
        if (err) {
            console.log('There was an error')
            return
        }
        console.log('Email was sent')
    })
}
like image 165
maxpaj Avatar answered Dec 09 '22 15:12

maxpaj