You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:40:33