我是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包含完整的电子邮件正文。有什么明显的我想念的吗?谢谢。
答案 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 函数仍应通过其内部代码运行。只是日志消息不会被记录,因为当时调用函数可能已经退出。