使用 async/await 函数通过 Imap 检索电子邮件

Lou*_*p G 3 javascript node.js async-await

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

收件箱:未定义

/Users/mainuser/node_modules/imap/lib/Connection.js:432 cb(err, self._box); ^ 类型错误: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()
Run Code Online (Sandbox Code Playgroud)

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

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

imap.connect()
Run Code Online (Sandbox Code Playgroud)

ant*_*nku 5

如果您更喜欢使用 Promise,您应该编写一个自定义包装器imap.openBox或使用 Node.js 内置util.promisify函数包装它:

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()
Run Code Online (Sandbox Code Playgroud)

为了 Promisify 整个 API,请尝试将 imap 实例包装在Bluebird.promisifyAll中。请注意,promisified 方法可使用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()
Run Code Online (Sandbox Code Playgroud)