它使用2个模块:fs(构建到节点v0.8.18)和nodemailer(来自NPM,v0.3.42).
现在,在使用节点newsletter.js执行时,它有时会完成并完成,但有时它会随机失败并出现以下错误:
stream.js:81 throw er; // Unhandled stream error in pipe. ^ Error: write EPIPE at errnoException (net.js:770:11) at Object.afterWrite (net.js:594:19)
据我所知,发生EPIPE错误是因为连接的另一端掉线然后我们尝试写入该连接.此EPIPE错误错误的所有现有报告都在打开http连接或类似连接的上下文中.
在我下面的内容中,可能导致错误的两件事是NewsletterEmail中的fs.readFileSync或NewsleterMailer中的mailer.send.它更可能是错误发生在mailer.send和nodemailer在某处打开连接.但是,没有错误通过throw或callback错误参数传回,因此似乎无法查看导致错误的原因.
大多数人建议定义错误处理程序.但是,nodemailer或fs模块中没有任何内容允许我定义错误处理程序.来自mailer.send调用的nodemailer中的回调确实在其回调中传递了一个错误参数,但是这个特定的错误并没有通过那里传递.
我试过以下的事情:
>在fs.readFileSync和nodemailer传输sendEmail调用周围添加try / catch.
>删除fs.readFileSync调用并内联html – 当我这样做时,错误似乎不会发生.但同样,节点文档没有迹象表明在readFileSync上应该发生EPIPE错误,并且肯定无法添加错误处理程序.
var nodemailer = require('nodemailer'); var fs = require('fs'); /** * Provides a way to build newsletters when given a folder containing * the relevant template and images in a standard format. This folder * must contain a newsletter.html file,a newsletter.txt file and a images * directory containing any images. * * @param {Object} settings The full folder path to the */ function NewsletterEmail(newsletterGroup,newsletterName) { var folder = '/var/newsletters/' + newsletterGroup + '/' + newsletterName; this._html = fs.readFileSync(folder + '/newsletter.html','utf-8'); this._text = fs.readFileSync(folder + '/newsletter.txt','utf-8'); } NewsletterEmail.prototype.getSubject = function() { return 'Testing'; } /** * Generates the HTML version of a newsletter. * * @return {String} */ NewsletterEmail.prototype.buildHTML = function(email) { var htmlPart = this._html; return htmlPart; } /** * Generates the text counterpart of a newsletter. * * @return {String} */ NewsletterEmail.prototype.buildText = function(email) { var textPart = this._text; return textPart; } /** * Creates a NewsletterEmail from the given folder. * * @param {String} folder The folder containing the html template,text template and images for a newsletter. * @return {NewsletterEmail} */ NewsletterEmail.create = function(newsleterGroup,newsletterName) { return new NewsletterEmail(newsleterGroup,newsletterName); } function NewsletterMailer(fromEmail) { this._from = fromEmail; this._transport = nodemailer.createTransport('sendmail'); } NewsletterMailer.prototype = { send: function(email,newsletterEmail,callback) { var mailOptions = { to: email,from: this._from,subject: newsletterEmail.getSubject(),html: newsletterEmail.buildHTML(email),text: newsletterEmail.buildText(email) }; this._transport.sendMail(mailOptions,callback); },close: function() { this._transport.close(); } } function Newsletter() { this._id = 1; this.countSent = 0; this.emailsToSend = ['email1@example.com','email2@example.com','email3@example.com','email4@example.com','email5@example.com','email6@example.com']; } Newsletter.prototype.send = function() { var newsletter = this; var newsletterEmail = NewsletterEmail.create('company1','2013-01-24-Mynewsleter'); var mailer = new NewsletterMailer('company@example.com'); function sendEmail() { var email = newsletter.emailsToSend.pop(); mailer.send(email,function(mailerErr) { if (mailerErr) { console.log('Mailer error: ',mailerErr); } newsletter.countSent++; console.log('progress ' + newsletter.countSent); if (newsletter.emailsToSend.length > 0) { sendEmail(); } else { mailer.close(); console.log('complete'); } }); } sendEmail(); } var nl = new Newsletter(); nl.send();
有没有其他人遇到类似的错误?您有任何调试或可能的解决方案的提示.
现在使用堆栈跟踪给出了一点死路.以下是strace的输出.似乎总是死在邮件mimepart边界上:
futex(0x7f039c0008c8,FUTEX_WAKE_PRIVATE,1) = 1 write(8,"------Nodemailer-0.3.42-?=_1-136"...,131) = -1 EPIPE (broken pipe) --- SIGPIPE {si_signo=SIGPIPE,si_code=SI_USER,si_pid=13813,si_uid=0} --- --- SIGCHLD {si_signo=SIGCHLD,si_code=CLD_EXITED,si_pid=13818,si_status=0,si_utime=0,si_stime=0} --- write(4,"\1\0\0\0\0\0\0\0",8) = 8 rt_sigreturn() = -1 EPIPE (broken pipe) futex(0x7f039c0008c8,"<!DOCTYPE HTML PUBLIC =22-//W3C/"...,18098) = -1 EPIPE (broken pipe) --- SIGPIPE {si_signo=SIGPIPE,si_uid=0} --- futex(0x7f039c0008c8,1) = 1 close(8) = 0 epoll_wait(3,{{EPOLLIN|EPOLLHUP,{u32=9,u64=4294967305}},{EPOLLIN|EPOLLHUP,{u32=11,u64=4294967307}},{EPOLLIN,{u32=4,u64=4294967300}}},64,0) = 3 epoll_ctl(3,EPOLL_CTL_MOD,9,u64=4294967305}}) = 0 epoll_ctl(3,11,u64=4294967307}}) = 0 read(4,8) = 8 wait4(-1,[{WIFEXITED(s) && WEXITSTATUS(s) == 0}],WNOHANG|WSTOPPED|WCONTINUED,NULL) = 13818 ioctl(1,SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS,0x7fff2d6f4340) = -1 EINVAL (Invalid argument) fstat(1,{st_mode=S_IFIFO|0600,st_size=0,...}) = 0 write(1,"progress 1\n",11progress 1 ) = 11 socketpair(PF_FILE,SOCK_STREAM|SOCK_CLOEXEC,[7,8]) = 0 socketpair(PF_FILE,[10,12]) = 0 socketpair(PF_FILE,[13,14]) = 0 pipe2([15,16],O_NONBLOCK|O_CLOEXEC) = 0 clone(child_stack=0,flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD,child_tidptr=0x7f03a4b35a10) = 13820 close(16) = 0 poll([{fd=15,events=POLLIN|POLLHUP}],1,-1) = 1 ([{fd=15,revents=POLLHUP}]) close(15) = 0 close(7) = 0 ioctl(8,FIONBIO,[1]) = 0 close(12) = 0 ioctl(10,[1]) = 0 close(14) = 0 ioctl(13,[1]) = 0 wait4(-1,0x7fff2d6f529c,NULL) = 0 futex(0x7f039c0008c8,1) = 1 brk(0x932000) = 0x932000 read(11,"",65536) = 0 close(11) = 0 read(9,65536) = 0 futex(0x7f039c0008c8,1) = 1 close(9) = 0 write(2,"\n",1 ) = 1 write(2,"events.js:71\n",13events.js:71
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。