Javascript 使用异步/等待功能通过Imap检索电子邮件

Javascript 使用异步/等待功能通过Imap检索电子邮件,javascript,node.js,async-await,Javascript,Node.js,Async Await,当我尝试使用下面的代码(使用异步函数)通过imap检索电子邮件时,我得到以下控制台输出/错误: 收件箱:未定义 /Users/mainuser/node_modules/imap/lib/Connection.js:432 cb(错误,自我保护盒); ^ 类型错误:cb不是一个函数 var Imap = require('imap'); var inspect = require('util').inspect; var imap = new Imap({ user: 'mymailnam

当我尝试使用下面的代码(使用异步函数)通过imap检索电子邮件时,我得到以下控制台输出/错误:

收件箱:未定义

/Users/mainuser/node_modules/imap/lib/Connection.js:432 cb(错误,自我保护盒); ^ 类型错误:cb不是一个函数

var Imap = require('imap');
var inspect = require('util').inspect;

var imap = new Imap({
  user: 'mymailname@mail.com',
  password: 'mymailpassword',
  host: 'imap.mail.com',
  port: 993,
  tls: true
});

const openInbox = async () => {
  try {
    const inbox = await imap.openBox('INBOX', true)
    return inbox
  }catch(error){
    console.log("Error: "+ error)
  }
}

imap.once('ready', () => {
  console.log('ready')
  openInbox()
   .then(inbox => console.log('Inbox: ' + inbox))
});

imap.connect()
但是,我可以打开收件箱并使用嵌套回调输出收件箱对象,如下所示:

imap.once('ready', () => {
  imap.openBox('INBOX', true, (err, inbox) => {
    console.log('Inbox: ' + inbox)
  });
});

imap.connect()

如果您喜欢使用Promissions,您应该围绕
imap.openBox
编写一个自定义包装,或者使用Node.js内置函数包装它:

const Imap = require('imap');
const promisify = require('util').promisify;

const imap = new Imap({
  user: 'mymailname@mail.com',
  password: 'mymailpassword',
  host: 'imap.mail.com',
  port: 993,
  tls: true
});

const openBox = promisify(imap.openBox.bind(imap));

imap.once('ready', () => {
  console.log('ready')
  openBox('INBOX', true)
    .then(inbox => console.log(inbox))
    .catch(err => {
      console.log(err)
    })
});

imap.connect()
为了简化整个API,请尝试将imap实例包装到中。注意:推荐的方法具有
Async
前缀:

const bluebird = require('bluebird');
const Imap = require('imap');

const imap = bluebird.promisifyAll(new Imap({
    user: 'mymailname@mail.com',
    password: 'mymailpassword',
    host: 'imap.mail.com',
    port: 993,
    tls: true
}));

imap.once('ready', () => {
  console.log('ready')
  imap.openBoxAsync('INBOX', true)
    .then(inbox => console.log(inbox))
    .catch(err => {
      console.log(err)
    })
});

imap.connect()

谢谢我希望我可以使用Asyn/WAIT函数。尽管如此,这让我更接近解决方案。在我通过这样做promisify imap.openbox之后:const openbox=promisify(imap.openbox.bind(imap));我现在能够成功地记录收件箱对象。现在唯一的问题是:我如何承诺整个imap API?您好@LoupG,您可以尝试使用Bluebird.promisifyAll来承诺整个API。我已经更新了答案,在对你的答案做出评论之前,我已经尝试过了,我想我应该这么说。你试过了吗?如果它对你有用,你能把代码作为答案的一部分吗。提前谢谢是的,它对我有用。我已经将利用
bluebird.promisifyAll
的代码添加到了答案中。非常感谢,我没有意识到promisify库将我的promisify添加到方法名称后重命名了方法!显然,
imap
库不支持Promise您是对的,它不支持。我只是想找个办法现在就去图书馆,有什么想法吗?我试过使用蓝鸟promisifyall,没有骰子。你可以在下面的答案下看到评论。ThanksUpdate:imap simple library于2020年4月发布。它有内置的承诺,IMO使异步函数更简单。