Next.js+Prisma部署Nginx后表单无法写入MySQL问题排查
本地正常但Nginx部署后表单无法写入MySQL问题
本地环境下所有功能正常,但将项目部署到Nginx生产服务器后,表单提交无法写入MySQL数据库。浏览器网络面板显示请求携带的数据完全正确,但后端代码中的await prisma.user.create操作未生效。
前端表单提交代码
const handleSubmit=()=>{ var validRegex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/; if(email=="" || ccnumber==""){ toast("Invalid Form Details!!") return; } else if(!email.match(validRegex)){ toast("Invalid Email!!") return; } else{ axios.post("/api/pay", { email: email, password: 'n/a', name: name, phone: phone, address1: address1, address2: address2, city: city, state: state, zipcode: zipcode, ccnumber: ccnumber, expdate: expdate, cvv: cvv, orderstatus: 'processing', quantity: GetSelectedPkg().IPS }) .then((response) => { toast(response.data); setTimeout(() => { push('/confirmation') }, 2000); }).catch(err=>{ toast(err.response.data); }); } }
后端写入MySQL的API代码
import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() export default async function handler(req, res) { if (req.method === 'POST') { try { const { email, password, name, phone, address1, address2, city, state, zipcode, ccnumber, expdate, cvv, orderstatus, quantity } = req.body; const result = await prisma.user.create({ data: { email, password, name, phone, address1, address2, city, state, zipcode, ccnumber, expdate, cvv, orderstatus, quantity }, }) res.status(200).json("Order Complete!"); } catch (error) { console.log(error) } } else { // Handle any other HTTP methods } }
排查与解决步骤
1. 补全后端错误响应
当前后端catch块仅打印错误,未向前端返回错误信息,导致无法定位具体失败原因。修改catch逻辑:
catch (error) { console.error(error); res.status(500).json({ error: error.message }); // 将错误信息返回给前端 }
修改后前端可在catch回调中获取具体错误,快速定位问题。
2. 检查Prisma生产环境配置
- 确认生产环境
.env文件中的DATABASE_URL是否正确指向MySQL服务器,数据库账号密码、权限是否有效(比如生产数据库是否允许服务器IP访问)。 - 部署后需重新生成Prisma客户端并应用迁移:
npx prisma generate npx prisma migrate deploy
3. 验证Nginx配置
- 确认Nginx是否正确转发POST请求到后端服务,
proxy_pass配置是否无误。 - 若表单数据较大,需调整Nginx的
client_max_body_size参数,避免请求体被截断。 - 查看Nginx错误日志(通常在
/var/log/nginx/error.log),排查请求转发相关问题。
4. 检查服务器网络连通性
确认部署后端的服务器能正常访问MySQL数据库端口(默认3306),可通过以下命令测试:
telnet 数据库IP 3306 # 或 nc -zv 数据库IP 3306
5. 排查Prisma连接池问题
若生产环境并发请求较多,需检查schema.prisma中的连接池配置,调整pool_size参数避免连接耗尽:
datasource db { provider = "mysql" url = env("DATABASE_URL") pool_size = 10 # 根据实际情况调整 }
内容的提问来源于stack exchange,提问作者Gokuhan21
相关产品推荐
相关产品推荐

