You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么simpleParser内赋值的token变量在getEmails函数中为空?

问题原因

这个问题的核心是异步回调的执行顺序问题:
代码中所有imap事件回调、simpleParser的回调都是异步执行逻辑,JS引擎不会等待这些回调执行完成,会先跑完getEmails函数的所有同步代码。当你在getEmails末尾打印token、返回token的时候,simpleParser的赋值逻辑还没触发,token还保持初始的空字符串值;只有后续异步回调触发后,token才会被赋值,所以你在回调内部打印能拿到预期结果。

解决方法

把整个imap操作逻辑封装成Promise,等待邮件解析完成后再resolve返回token,外部调用时用await就能拿到正确结果,修改后的参考代码如下:

const Imap = require('imap');
const {simpleParser} = require('mailparser');
const imapConfig = {
  user: '',
  password: '',
  host: 'imap.gmail.com',
  port: 993,
  tls: true,
  tlsOptions: {
    rejectUnauthorized: false
  }
};

async function getEmails() {
  return new Promise((resolve, reject) => {
    let token = "";
    const imap = new Imap(imapConfig);
    imap.once('ready', () => {
      imap.openBox('INBOX', false, () => {
        imap.search(['UNSEEN'], (err, results) => {
          if(err) return reject(err);
          const f = imap.fetch(results, {bodies: ''});
          f.on('message', msg => {
            msg.on('body', stream => {
              simpleParser(stream, (err, parsed) => {
                if(err) return reject(err);
                let tokenNr = parsed.html.search('token');
                token = parsed.html.substring(tokenNr+6, tokenNr+66);
                console.log(token);
              });
            });
          });
          f.once('error', ex => {
            reject(ex);
          });
          f.once('end', () => {
            console.log('Done fetching all messages!');
            imap.end();
            // 所有邮件解析完成后返回token
            resolve(token);
          });
        });
      });
    });

    imap.once('error', err => {
      reject(err);
    });

    imap.once('end', () => {
      console.log('Connection ended');
    });

    imap.connect();
  })
};

// 调用示例
// (async () => {
//   const token = await getEmails();
//   console.log('拿到的token是', token);
// })()

另外建议不要用全局变量存token,把变量放在Promise内部可以避免并发调用时的变量污染问题。

内容的提问来源于stack exchange,提问作者wertigos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:15:05