异步等待Nodejs API调用

时间:2020-10-28 20:14:29

标签: javascript node.js promise async-await

我正在尝试在另一个函数(API调用)返回其结果之后执行一个函数。问题是,程序总是在第一个给出结果之前执行第二个。

问题是,我需要使用Mailjet在电子邮件列表中添加联系人电子邮件,但是首先我必须创建该联系人。因此,联系人创建有效,但列表上的位置无效,因为此功能在联系人创建完成之前执行。

几天来,我尝试了多种方法,主要是使用async / await,但是我仍然不敢理会。

这是我的代码:

routes / index.js

router.post('/', async (req, res, next) => {
  const { email, name } = req.body;
  const mktListId = process.env.MAILJET_ID_MARKETING;

  try {
    const contactCreated = await createContact(email, name);
    addEmailToList(email, mktListId);
    res.status(201).send({ message: 'Email Successfully subscribed to Marketing List' });
  } catch (err) {
    res.status(400).json({
      status: 'fail',
      message: err,
    });
  }
});
function createContact(email, name) {
  const mailjet = require('node-mailjet').connect(
    process.env.MAILJET_MASTER_APIPUBLIC,
    process.env.MAILJET_MASTER_APISECRET
  );
  const request = mailjet.post('contact', { version: 'v3' }).request({
    IsExcludedFromCampaigns: 'true',
    Name: `${name}`,
    Email: `${email}`,
  });
  request
    .then(result => {
      console.log('result mailjet create contact', result.body);
    })
    .catch(err => {
      console.log('error mailjet create contact', err.statusCode, err.ErrorMessage);
    });
}
function addEmailToList(email, listId) {
  const mailjet = require('node-mailjet').connect(
    process.env.MAILJET_MASTER_APIPUBLIC,
    process.env.MAILJET_MASTER_APISECRET
  );
  const request = mailjet.post('listrecipient', { version: 'v3' }).request({
    IsUnsubscribed: 'true',
    ContactAlt: `${email}`,
    ListID: `${listId}`,
  });
  request
    .then(result => {
      console.log('result mailjet add to list', result.body);
    })
    .catch(err => {
      console.log('error mailjet add to list', err.statusCode, err.ErrorMessage);
    });
}

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

没有承诺,等待实际上什么也没做。

await new Promise (resolve => {
    console.log ("A");

    resolve ();
});
await new Promise (resolve => {
    console.log ("B");

    resolve ();
});
await new Promise (resolve => {
    console.log ("C");

    resolve ();
});

create函数的外观应类似于:

function createContact(email, name) {
    return new Promise ((resolve, reject) => {
        const mailjet = require('node-mailjet').connect(
          process.env.MAILJET_MASTER_APIPUBLIC,
          process.env.MAILJET_MASTER_APISECRET
        );
        const request = mailjet.post('contact', { version: 'v3' }).request({
          IsExcludedFromCampaigns: 'true',
          Name: `${name}`,
          Email: `${email}`,
        });
        request
          .then(result => {
            console.log('result mailjet create contact', result.body);

            resolve ();
          })
          .catch(err => {
            console.log('error mailjet create contact', err.statusCode, err.ErrorMessage);

            reject ();
          });
    });
}

答案 1 :(得分:0)

这是干净的最终代码,供以后参考:

routes / index.js

const express = require('express');
const router = express.Router();
const emailController = require('../controllers/emailController');

router.post('/', subscriberValidationRules(), validate, emailController.create);

然后我们将路由器逻辑放在:

controllers / emailController.js

const { createContact, addEmailToList } = require('../helpers/addEmailToList');

const create = async (req, res, next) => {
  const { email, name } = req.body;
  const mktListId = process.env.MAILJET_ID_MARKETING;

  try {
    await createContact(email, name);
    await addEmailToList(email, mktListId);
    return res.status(201).send({ message: 'Email Successfully subscribed to Marketing List' });
  } catch (err) {
    res.status(400).json({
      status: 'fail',
      message: err,
    });
  }
}

module.exports = {
  create,
};

然后我们的功能开启:

helpers / addEmailToList.js


const createContact = async (email, name) => {
  try {
    const mailjet = require('node-mailjet').connect(
      process.env.MAILJET_MASTER_APIPUBLIC,
      process.env.MAILJET_MASTER_APISECRET,
    )
    const { body } = await mailjet.post('contact', { version: 'v3' }).request({
      IsExcludedFromCampaigns: 'true',
      Name: `${name}`,
      Email: `${email}`,
    })
    console.info('result mailjet create contact', body)
    return body
  } catch (err) {
    console.info('error mailjet create contact', err.statusCode, err.ErrorMessage)
  }
}

const addEmailToList = async (email, listId) => {
  const mailjet = require('node-mailjet').connect(
    process.env.MAILJET_MASTER_APIPUBLIC,
    process.env.MAILJET_MASTER_APISECRET
  );
  try {
    const { body } = await mailjet.post('listrecipient', { version: 'v3' }).request({
      IsUnsubscribed: 'true',
      ContactAlt: `${email}`,
      ListID: `${listId}`,
    });
    console.info('result mailjet add to list', body);
    return body;
  } catch (err) {
    console.info('error mailjet add to list', err.statusCode, err.ErrorMessage);
  }
};

module.exports = {
  createContact,
  addEmailToList,
};