优化节点应用程序以处理Gmail数据

时间:2018-09-28 07:47:15

标签: node.js gmail-api service-accounts

我有一个node.js应用程序,该应用程序使用Gmail API来检索用户的电子邮件以进行其他内容处理。

我正在使用具有域范围委派的服务帐户来授权用户并访问其邮箱。目前,我分别授权每个用户,使用gmail.list列出其前24小时的电子邮件,然后在每个电子邮件上使用gmail.get以获取内容,然后对其进行处理。所有用户都是并行处理的。

在当前状态下,该应用程序使用大量内存,考虑到用户数量(超过50.000),我认为这是正常现象,我正在寻找一些有关如何对其进行优化的提示。有谁对我应该做些什么或有所改进有任何提示?

谢谢!

编辑:

这是我当前的代码:

async function getEmail(id, user, auth) {
  try {
    const gmail = google.gmail({ version: 'v1', auth });
    const data = await gmail.users.messages.get({ user, id });
    let encoded = '';
    if (data.data.payload.parts) {
      for (let i = 0; i < data.data.payload.parts.length; i += 1) {
        encoded += data.data.payload.parts[i].body.data;
      }
    } else {
      encoded = data.data.payload.body.data;
    }
    const content = Buffer.from(encoded, 'base64').toString('ascii');
    return {
      content,
      email: data.data,
    };
  } catch (e) {
    return null;
  }
}

async function getMailBox(user, query = '') {
  try {
    const mailBox = [];
    const jwt = new google.auth.JWT(
      SERVICE_ACCOUNT.client_email,
      null,
      SERVICE_ACCOUNT.private_key,
      ['https://www.googleapis.com/auth/gmail.readonly'],
      user,
    );
    const auth = await authorize(jwt);
    const gmail = google.gmail({ version: 'v1', auth });
    const data = await gmail.users.messages.list({ userId: user, maxResults: 100, q: query });
    for (const m of data.data.messages) {
      const email = await getEmail(m.id, user, auth);
      if (email) {
        mailBox.push({
          text: email.content,
          email: email.email,
        });
      }
    }
    return mailBox;
  } catch (e) {
    return [];
  }
}

async function processUser(user) {
  const tomorrow = moment().add(1, 'days').format('YYYY/MM/DD');
  const yesterday = moment().add(-1, 'days').format('YYYY/MM/DD');
  const query = `before:${tomorrow} after:${yesterday}`;

  const mailbox = await getMailbox(user, query);
  if (mailbox.length > 0) {
    analyzeData(user, mailbox);
  }
} 

users.forEach(u => processUser(u));

0 个答案:

没有答案