未执行NodeJS mailparser

时间:2019-08-23 07:48:00

标签: node.js

我是NodeJS的新手。我脚本中的以下代码段未执行,也未记录任何错误。

console.log('流程附件');

          const simpleParser = require('mailparser').simpleParser;

          console.log('Process attachment');

          simpleParser(data.Body, (err, mail) => {
              if (err) {
                  console.log('attachment error');
                  console.log(err)
                  callback(null, null);
              } else {
                  console.log('attachment success');
                  console.log(mail)
                  console.log(mail.attachments[0])
                  console.log(mail.attachments[0].content)
                  console.log(mail.attachments[0].content.toString('ascii'))
                  callback(null, null);
              }
          })

          console.log('Exit');
          process.exit(); 

进程附件和退出正在控制台中记录,但是由于某些原因,该代码永远不会进入if或else中。因此,由于某些原因,似乎未执行simpleParser函数。 data.Body包含完整的电子邮件正文。有什么明显的我想念的吗?谢谢。

3 个答案:

答案 0 :(得分:0)

您正在过早终止脚本。

simpleParser正在异步执行。因此,console.log('Exit'); process.exit();位在您的simpleParser完成之前被调用。

答案 1 :(得分:0)

您为什么不使用诺言呢? 这将起作用

   simpleParser(data.Body).then(mail=>{
    console.log('attachment success');
    console.log(mail)
    console.log(mail.attachments[0])
    console.log(mail.attachments[0].content)
    console.log(mail.attachments[0].content.toString('ascii'))
   }).then(()=>{
    console.log('Exit');
    process.exit(); 
   }).catch(err=>{
    console.log('attachment error');
    console.log(err);
   }) 


如果您想使其看起来更简单,可以使用Async/Await这样更简洁


const parseMail = async ()=>{
    try {
        let mail =  await simpleParser(data.Body);
           console.log('attachment success');
              console.log(mail)
              console.log(mail.attachments[0])
              console.log(mail.attachments[0].content)
              console.log(mail.attachments[0].content.toString('ascii'))
      }
      catch(err) {
          console.log('attachment error');
          console.log(err);

      }
      console.log('Exit');
      process.exit(); 
}


答案 2 :(得分:0)

我们经历了完全相同的行为。上述响应程序是正确的,因为 console.log 命令没有在 mailparser 函数中记录任何内容,因为它是异步运行的,并且调用函数在不等待 mailparser 执行其操作的情况下退出。

对我们来说,简单的解决方案是使用 await 调用 mailparser,这样调用函数会等待 mailparser 完成,然后再继续。

所以,而不是:

simpleParser(data.Body, (err, mail) => {console.log('message');});

试试这个:

let mail = await simpleParser(data.Body);
if (mail != null) {console.log('message');};

就其价值而言,我认为没有 await 的异步 simpleParser 函数仍应通过其内部代码运行。只是日志消息不会被记录,因为当时调用函数可能已经退出。