Node.js中IMAP getMail方法控制台有输出但Postman无返回求助
问题分析与修复方案
你的代码核心问题是IMAP连接从未触发end事件,导致返回的Promise一直处于pending状态,Postman自然拿不到结果。控制台能打印是因为邮件内容确实被读取了,但读取完成后没有主动关闭连接,end事件不触发,Promise就不会resolve。
具体修复步骤:
- 在所有邮件读取完成后手动关闭IMAP连接,触发
end事件让Promise resolve - 修正
buffer的赋值逻辑,避免chunk内容被覆盖 - 完善错误处理,确保异常能传递到Promise的reject分支
修改后的完整代码:
async getMail() { let email_array = []; var imap = new Imap({ user: 'myuser', password: 'mypassword', host: 'myhost', // 注意原代码拼写错误,修正为myhost port: 143, tls: false, authTimeout: 3000 }); function openInbox(cb) { imap.openBox('INBOX', true, cb); } return new Promise((resolve, reject) => { imap.once('ready', function () { openInbox(function (err, box) { if (err) { imap.end(); return reject(err); } var f = imap.seq.fetch('1:1', { bodies: '1', struct: true }); f.on('message', function (msg, seqno) { console.log('Message #%d', seqno); let buffer = ''; // 移到message回调内部,避免变量污染 msg.on('body', function (stream, info) { stream.on('data', function (chunk) { buffer += chunk.toString('utf8'); // 累积chunk内容,而非直接覆盖 }); stream.once('end', function() { email_array.push(buffer); console.log("buffer", buffer); }); }); msg.once('end', function () { console.log('Message #%d Finished', seqno); }); }); // 所有邮件读取完成后主动关闭连接 f.once('end', function() { console.log('All messages fetched'); imap.end(); // 触发end事件,让Promise resolve }); f.once('error', function(err) { imap.end(); reject(err); }); }); }); imap.once('error', function (err) { reject(err); }); imap.once('end', function () { resolve(email_array); }); imap.connect(); }); }
关键修改说明:
- 将Promise逻辑提前,把所有IMAP事件监听纳入Promise内部,确保错误能正确传递到reject
- 在
fetch的end事件中调用imap.end(),手动触发连接关闭,让Promise正常resolve - 把
buffer变量移到message回调内部,避免多邮件场景下的变量污染,同时用+=累积chunk内容 - 所有错误分支都添加
imap.end()和reject(err),避免连接挂起和Promise长期pending
内容的提问来源于stack exchange,提问作者paranoid
相关产品推荐
相关产品推荐

