如何解决HTML表单提交到Node.js后端返回POST 500内部错误的问题
问题排查与解决步骤
第一步:先打印具体错误定位根因
你当前后端代码拿到错误直接返回500,没有打印错误日志,先修改server.js里的sendMail回调逻辑,查看具体报错:
sendMail(fullName,phone,email,subject,message, function(err,data){ if(err){ // 新增错误打印,查看后端控制台的具体报错信息 console.log('发信错误:', err) res.status(500).json({message: 'Internal error'}); }else{ res.json({message: 'Email sent...!!'}) } });
提交表单后查看后端运行的控制台输出,即可定位具体错误点。
第二步:修复
server.js已知的代码问题- 缺失
path模块引入:你在get路由里用了path.join,但顶部没引入path模块,会直接抛错 - 缺失表单数据解析中间件:jQuery默认的
$.post请求头是application/x-www-form-urlencoded,你只加了express.json()解析JSON格式请求,没加表单格式解析,会导致req.body为空 - 缺失端口监听逻辑:没有监听5000端口的代码,服务无法正常启动
- 缺失
修改后的server.js参考:
const express = require('express'); const path = require('path'); // 新增引入path模块 const app = express(); const sendMail = require('./mail.js'); app.use(express.static('public')); app.use(express.json()) // 新增表单格式请求解析 app.use(express.urlencoded({extended: true})) app.post('/email', (req,res) =>{ const {fullName,phone,email,subject,message} = req.body; console.log('Data:',req.body) sendMail(fullName,phone,email,subject,message, function(err,data){ if(err){ console.log('发信错误:', err) res.status(500).json({message: 'Internal error'}); }else{ res.json({message: 'Email sent...!!'}) } }); }) app.get('/', (req,res) =>{ res.sendFile(path.join(__dirname,'/public/Form/form.html')); }) // 新增端口监听 app.listen(5000, () => { console.log('服务运行在 http://localhost:5000') })
第三步:修复
mail.js的参数错误
nodemailer的发信配置mailOptions不支持自定义的fullName、phone、email、message字段,必须按照要求填写标准字段:
to字段:必填,填你要收信的个人邮箱text/html字段:必填,填邮件正文内容,你可以把用户提交的姓名、电话、邮箱、留言都拼到正文中
修改后的mail.js的sendMail函数参考:
const sendMail = (fullName,phone,email,subject,message,cb) =>{ const mailOptions = { from:'Collymore <erroldavids22@gmail.com>', to: '你的收信邮箱地址', // 替换为你自己的收信邮箱 subject: subject, // 拼接邮件正文内容 text: ` 用户姓名:${fullName} 联系电话:${phone} 联系邮箱:${email} 留言内容:${message} ` }; transporter.sendMail(mailOptions, function(err, data){ if(err){ cb(err,null); }else{ cb(null, data); } }); }
第四步:检查MailGun配置
- 确认
config.js里的apiKey是MailGun后台提供的私钥,不是公钥 - 确认
baseUrl是你在MailGun后台绑定的有效域名,如果用的是MailGun提供的免费测试域名,只能发往你在MailGun后台添加过的授权收件人邮箱,发往其他邮箱会被拦截。
- 确认
内容的提问来源于stack exchange,提问作者Errol Davids
相关产品推荐
相关产品推荐

