我在Heroku上遇到Nodemailer的问题,我非常感谢你的帮助。
我的应用程序的早期版本曾经在Heroku上工作没有问题,当我回滚到该版本时,它仍然可以正常工作。在最新版本的应用程序中,我没有对Nodemailer的代码访问进行任何更改,所以这对我来说没有任何意义。
nodemailer的版本是:0.6.5
以下是日志消息:
2015-02-18T04:29:57.730815+00:00 app[web.2]: POST /employer/53f44e3df4f8150200554eb7/job/ 200 32ms - 581b
2015-02-18T04:29:58.045066+00:00 app[web.2]: /app/node_modules/nodemailer/node_modules/simplesmtp/lib/client.js:918
2015-02-18T04:29:58.045069+00:00 app[web.2]: this._xoauth2.reconnectCount = 0;
2015-02-18T04:29:58.045070+00:00 app[web.2]: ^
2015-02-18T04:29:58.041300+00:00 app[web.2]: Exit callback being invoked
2015-02-18T04:29:58.045072+00:00 app[web.2]: TypeError: Cannot assign to read only property 'reconnectCount' of false
2015-02-18T04:29:58.045073+00:00 app[web.2]: at SMTPClient._actionAUTHComplete (/app/node_modules/nodemailer/node_modules/simplesmtp/lib/client.js:918:34)
2015-02-18T04:29:58.045075+00:00 app[web.2]: at SMTPClient._onData (/app/node_modules/nodemailer/node_modules/simplesmtp/lib/client.js:352:29)
2015-02-18T04:29:58.045076+00:00 app[web.2]: at TLSSocket.emit (events.js:107:17)
2015-02-18T04:29:58.045078+00:00 app[web.2]: at readableAddChunk (_stream_readable.js:163:16)
2015-02-18T04:29:58.045079+00:00 app[web.2]: at TLSSocket.Readable.push (_stream_readable.js:126:10)
2015-02-18T04:29:58.045080+00:00 app[web.2]: at TCP.onread (net.js:529:20)
2015-02-18T04:29:58.769185+00:00 heroku[web.2]: Process exited with status 1
2015-02-18T04:29:58.780771+00:00 heroku[web.2]: State changed from up to crashed
2015-02-18T04:29:58.780771+00:00 heroku[web.2]: State changed from crashed to starting
2015-02-18T04:30:00.371578+00:00 heroku[web.2]: Starting process with command `node app.js`
2015-02-18T04:30:01.904015+00:00 app[web.2]: Detected 512 MB available memory, 512 MB limit per process (WEB_MEMORY)
2015-02-18T04:30:01.904115+00:00 app[web.2]: Recommending WEB_CONCURRENCY=1
2015-02-18T04:30:02.288471+00:00 app[web.2]: Failed to load c++ bson extension, using pure JS version
2015-02-18T04:30:02.652326+00:00 app[web.2]: Started in PROD mode
2015-02-18T04:30:02.815284+00:00 app[web.2]: Express server listening on port 9622
2015-02-18T04:30:03.291115+00:00 heroku[web.2]: State changed from starting to up
我们可以看到它在' client.js'的第918行失败了。错误:
TypeError:无法分配给只读属性' reconnectCount'是的。
为什么会尝试分配错误的'到' reconnectCount'?
我的代码很简单:
app.locals.smtpTransport = nodemailer.createTransport(' SMTP',{ 服务:' Gmail', auth:{ 用户:" example@gmail.com", 传球:"传球123" } }); 然后我使用代码发送邮件,如:
req.app.locals.smtpTransport.sendMail(......
此代码适用于我的Heroku临时实例,因此对我没有意义。
我已经记录了Heroku的支持请求以及您可以提供的任何指导我将传递给他们。
非常感谢你的帮助。
答案 0 :(得分:11)
我刚从Nodemailer得到以下回复:
您可能正在运行iojs中的Nodemailer。只有最新版本的Nodemailer支持节点0.12和iojs,所以你应该像这样自己升级或修复918行:
if(this._xoauth2){
this._xoauth2.reconnectCount = 0;
}
在ES5中允许将属性设置为布尔值,但是iojs运行ES6并尝试在ES6严格模式下设置属性会引发错误。
我想通过将我的包文件中的node.js版本显式设置为使用ES5的旧版本来修复此问题。
这解决了我的问题。获得的经验是始终在包文件中设置nodejs版本,否则Heroku使用最新版本,它可能与您的模块不兼容。
非常感谢Nodemailer,他们以极快的速度回复了我。
希望这会帮助别人。
感谢。
答案 1 :(得分:8)
我正在使用meteor进行ubuntu安装,升级到Node.js v12.0并安装Meteor的帐户密码模块后,我遇到了类似的错误。
原来,由于Meteor尚未开始与Node.js v12.0的兼容性开发,因此在我的服务器上安装Node的新二进制文件与我的部署捆绑的二进制文件不兼容,因此我遇到了类似的错误。在这种情况下,问题不在于Nodemailer,而在于simplesmtp。
根据建议here,解决方案是删除捆绑版本并使用npm安装服务器本地版本。
因此,在我的部署脚本中,我在构建捆绑包后添加了以下行。
cd bundle/programs/server/
sudo rm -R ./npm/npm-bcrypt/node_modules/bcrypt
sudo npm install bcrypt
sudo rm -R ./npm/email/node_modules/simplesmtp
sudo npm install simplesmtp
这比修改源更容易,特别是如果您有脚本化部署。