为什么我通过Nodemailer接收的联系表单邮件内容显示undefined?
问题根因及修复方案
1. 表单提交数据无法被解析,导致req.body字段全部为undefined
你的联系表单设置了enctype = "multipart/form-data",该编码格式仅用于表单包含文件上传的场景,express内置的express.urlencoded、express.json中间件都无法解析该格式的请求体,所以你拼接邮件内容时取到的所有字段都是undefined。
修复方式二选一:
- 方案1:直接删除form标签里的
enctype = "multipart/form-data"属性即可,普通表单用默认的application/x-www-form-urlencoded编码就能被正常解析。 - 方案2:如果后续需要在联系表单增加文件上传功能,给
/send接口加上multer的无文件解析中间件:
// 在/send接口定义前新增这行 const uploadNone = multer().none() // 接口改造如下 app.post('/send', uploadNone, (req, res) => { // 原有逻辑保持不变 })
2. 邮件发送回调变量名错误
你在transporter.sendMail的回调里参数定义为(err, data),但后续错误判断用的是未定义的error变量,打印日志用的是未定义的info变量,会导致发送报错时日志无法正常输出,也可能引发逻辑异常。
修复方式:
把回调逻辑替换为如下内容:
transporter.sendMail(mailOptions, function (err, info) { if (err) { return console.log(err); } console.log('Message sent: %s', info.messageId); console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info)); });
3. 其他潜在问题(可选修复)
根路由app.get('/',( req, res) => { res.sendFile('/index.html') })的路径写法不符合要求,sendFile需要传入绝对路径,建议修改为:
res.sendFile(__dirname + '/public/index.html')
可选优化
你当前定义的全局变量subject、body、path存在并发安全问题,多个用户同时提交文档请求时会出现变量互相覆盖的情况,建议把这三个变量移到/sendemail接口的upload回调内部定义,不要使用全局变量。
内容的提问来源于stack exchange,提问作者Angelo228
相关产品推荐
相关产品推荐

