在cPanel部署Node.js-Express服务器遇500内部错误求助
Node.js邮件服务部署cPanel后500内部错误排查与修复
问题背景
为Angular开发的Node.js邮件服务,本地localhost:3000运行正常,提交联系表单可正常发送邮件,但部署到cPanel后触发Internal Server Error: 500。已在cPanel创建Node应用,根文件为server.js,其中var http代码由cPanel自动生成,其余为自定义代码。
相关代码
server.js
const express = require('express'); const sendMail = require('./mail.js'); const bodyParser = require('body-parser'); const cors = require('cors'); var http = require('http'); const app = express(); app.use(bodyParser.json()); app.use(cors()); var server = http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); var message = 'It works!\n', version = 'NodeJS ' + process.versions.node + '\n', response = [message, version].join('\n'); res.end(response); }); server.listen(); app.post('/submit', function(req, res) { const { name, email, phone, subject, message} = req.body; console.log(req.body); res.status(200).json({message: req.body}); sendMail(name, email, phone, subject, message, function(err, data) { if(err) { res.status(500).json({ message: 'Internal Error'}); } else { res.json({message: 'Email Sent!!!!!!'}); } }); })
mail.js
const nodemailer = require('nodemailer'); const mailGun = require('nodemailer-mailgun-transport'); const auth = { auth: { api_key: 'privatekey-381f2624-ccbf9964', domain: 'domain-17bb134be0f54584b0e8751d3a3ec19b.mailgun.org' } }; const transporter = nodemailer.createTransport(mailGun(auth)); const sendMail = (name, email, phone, subject, message, cb) => { const mailOptions = { from: email, to: 'webmaster@gmail.com', subject: subject, text: 'Name: ' + name + '\n Email:' + email + '\n Phone: ' + phone + '\n Message: ' + message }; transporter.sendMail(mailOptions, function(err, data) { if(err) { cb(err, null); } else { cb(null, data); } }); } module.exports = sendMail;
Angular EmailService
import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; @Injectable({ providedIn: 'root' }) export class EmailService { _url = 'https://gump.akc-uae.com/api/submit'; constructor(private _http: HttpClient) { } contact(clientData:any) { return this._http.post<any>(this._url, clientData); } }
排查与修复步骤
1. 修复服务器实例冲突问题
代码中同时创建了两个独立服务器:cPanel自动生成的http.createServer实例,和Express的app实例,但Express路由并未挂载到cPanel的服务器上,导致/submit路由无法被识别,触发500错误。同时原代码中提前发送响应的逻辑会导致后续回调重复发送响应,引发错误。
修改server.js:
// 替换原http.createServer代码,将Express app挂载到cPanel服务器 var server = http.createServer(app); server.listen(); // 修改submit路由,移除提前发送响应的代码 app.post('/submit', function(req, res) { const { name, email, phone, subject, message} = req.body; console.log(req.body); sendMail(name, email, phone, subject, message, function(err, data) { if(err) { res.status(500).json({ message: '发送邮件失败', error: err.message }); } else { res.json({message: '邮件已发送!'}); } }); })
2. 验证cPanel路由前缀匹配
Angular请求地址为https://gump.akc-uae.com/api/submit,需确认:
- cPanel中Node应用的URL路径已设置为
/api - 应用根目录正确指向包含
server.js的文件夹,确保/submit路由能被解析为/api/submit
3. 确保依赖包完整部署
cPanel部署时需确认node_modules已上传,或通过cPanel终端执行:
npm install express body-parser cors nodemailer nodemailer-mailgun-transport
4. 查看cPanel错误日志定位细节
通过cPanel面板Metrics > Errors或文件管理器查看/home/你的用户名/logs/你的域名_error_log,日志会明确显示500错误的具体原因(如依赖缺失、API密钥无效、端口问题等)。
5. 验证Mailgun生产环境配置
- 确认Mailgun的
api_key和domain有效,且域名已完成DNS验证 - 检查Mailgun账户发送额度及限制,部分免费账户要求使用已验证域名邮箱作为发件人,不能直接使用用户提交的邮箱
内容的提问来源于stack exchange,提问作者Muhammad Shahzaib
相关产品推荐
相关产品推荐

