Node.js - 包错误处理

时间:2018-03-21 08:56:58

标签: node.js error-handling

我对Node相对缺乏经验,我被要求创建一个POP3电子邮件客户端。我能找到的处理POP3的最新软件包是node-poplib-yapc,我一直在玩它,看看它是如何工作的。

现在我遇到的问题是我不知道如何使用这个包进行错误处理,我一直故意给它错误的登录详细信息,以便我可以测试它的错误处理。当我给它正确的凭据它似乎工作正常(我已经能够登录和下载电子邮件)所以我怀疑包有问题或我如何调用包。文档也完全不清楚,我能找到的唯一与(错误处理)错误处理相关的内容如下:

  

连接(回调)

     
      
  • 回调 - 函数(错误)//< - 这个'错误'变量就是我认为的意思'错误'
  •   
     

使用主机名和端口连接到邮件服务器。如果tls属性为true,则启动TLS连接。然后使用凭据属性用户名和密码登录您的邮箱。

阅读完上述内容后,我尝试了以下内容:

let popClient = require('node-poplib-yapc').Client;
let client = new popClient({ /* my incorrect credentials */ });

client.connect((err) => {
    if(err) {
        console.log('There was an error');
        console.log(err);
    }
});

但是这不起作用,而是在终端中抛出一个实际错误(我将在下面添加输出)。我也尝试了以下相同的结果:

client.connect(() => {
}, (err) => {
    console.log('There was an error');
    console.log(err);
});

好老try/catch,也让我失望:

try {
  client.connect(() => {
  });
} catch (err) {
  console.log(err);
}

当我运行上述任何代码时,它会在终端中抛出错误:

events.js:165
      throw er; // Unhandled 'error' event
      ^

Error: [AUTH] Username and password not accepted.
    at Client.onData (/home/lee/github/chatterbox/node_modules/node-poplib-yapc/main.js:97:10)
    at TLSSocket.emit (events.js:180:13)
    at addChunk (_stream_readable.js:269:12)
    at readableAddChunk (_stream_readable.js:256:11)

    at TLSSocket.Readable.push (_stream_readable.js:213:10)
    at TLSWrap.onread (net.js:578:20)
Emitted 'error' event at:
    at Client.onData (/home/lee/github/chatterbox/node_modules/node-poplib-yapc/main.js:107:10)
    at TLSSocket.emit (events.js:180:13)
[... lines matching original stack trace ...]
    at TLSWrap.onread (net.js:578:20)

我也尝试过的最后一件事是:

client.connect(() => {
}).catch(err => {
    console.log('There was an error');
    console.log(err);
});

导致以下错误:

/home/lee/github/chatterbox/service/email.js:29
  }).catch(err => {
    ^

TypeError: Cannot read property 'catch' of undefined
    at Object.getMail (/home/lee/github/chatterbox/service/email.js:29:5)
    at accounts.forEach (/home/lee/github/chatterbox/app.js:17:11)
    at Array.forEach (<anonymous>)

    at main (/home/lee/github/chatterbox/app.js:16:12)
    at Object.<anonymous> (/home/lee/github/chatterbox/app.js:27:1)
    at Module._compile (module.js:649:30)
    at Object.Module._extensions..js (module.js:660:10)
    at Module.load (module.js:561:32)
    at tryModuleLoad (module.js:501:12)
    at Function.Module._load (module.js:493:3)

如果有人能帮我解决如何正确处理像这样的包的错误,我会非常感激。显然,处理任何和所有错误(不仅仅是身份验证错误)的解决方案都是首选,但实际上只是指向正确方向的任何事情都会有所帮助。

3 个答案:

答案 0 :(得分:2)

client引发错误的原因是它是EventEmitter并且它会发出'error'个事件。由于您在'error'事件中没有任何事件监听器,因此它会爆炸。

这就是你所缺少的。

client.on('error', err => {
  console.error('client got error', err)
})

答案 1 :(得分:0)

其实先试试就行。当你调用connect时,如果凭证中有错误,则使用第一个param err调用回调,所以只有你缺少的东西才会返回if。

let popClient = require('node-poplib-yapc').Client;
let client = new popClient({ /* my incorrect credentials */ });

client.connect((err) => {
    if(err) {
        console.log('There was an error');
        console.log(err);
        ... you can throw additional error and what you need but after must
        return;
    }
    ... if there is no error you call list retrieve or what you need
});

答案 2 :(得分:0)

对我来说,我既需要connect方法中的错误回调处理程序,也需要单独的错误事件处理程序。

client.on('error', err => {
  console.error('client got error', err)
})
client.connect(function(err) {
  if(err)
  {
    console.log('error');
  }
  else{

    console.log('success');
  }

  })

 });