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

Node.js+Express+AWS SES报错:require未定义,send函数无法触发

问题核心

你踩了前后端环境混淆的坑:浏览器(前端)不支持Node.js的require语法,而且直接在HTML的onclick里调用服务端send()函数本身逻辑错误——前端和服务端是通过HTTP通信的,不能直接跨环境调用函数。

解决步骤

1. 重构服务端:新增邮件发送接口

把你原本的send()逻辑封装成Express的POST接口,放在服务端文件(比如app.js)里:

const express = require('express');
const nodemailer = require('nodemailer'); // 假设你用nodemailer发邮件,可替换成你用的库
const app = express();

// 解析表单提交的数据
app.use(express.urlencoded({ extended: true }));
// 托管静态页面目录(你的HTML文件要放在这里)
app.use(express.static('public'));

// 邮件发送接口
app.post('/send-mail', (req, res) => {
  // 这里写你原来的send()函数逻辑
  const transporter = nodemailer.createTransport({
    // 填你的邮箱SMTP配置,比如Gmail/QQ邮箱
    service: 'Gmail',
    auth: {
      user: '你的邮箱地址',
      pass: '你的邮箱授权码'
    }
  });

  const mailOpts = {
    from: req.body.userEmail,
    to: '接收邮件的地址',
    subject: req.body.mailSubject,
    text: req.body.mailContent
  };

  transporter.sendMail(mailOpts, (err, info) => {
    if (err) {
      return res.status(500).send('邮件发送失败');
    }
    res.send('邮件发送成功');
  });
});

app.listen(3000, () => {
  console.log('服务跑在 http://localhost:3000');
});

2. 修改前端:通过HTTP请求触发接口

方式一:原生表单提交(最简单)

直接让表单提交到服务端的/send-mail接口,不需要额外JS:

<form action="/send-mail" method="POST">
  <input type="email" name="userEmail" placeholder="你的邮箱" required>
  <input type="text" name="mailSubject" placeholder="邮件主题" required>
  <textarea name="mailContent" placeholder="邮件内容" required></textarea>
  <button type="submit">发送邮件</button>
</form>

方式二:AJAX异步提交(无刷新)

想要页面不刷新就能发送,用JS写异步请求:

<form id="mailForm">
  <input type="email" id="userEmail" placeholder="你的邮箱" required>
  <input type="text" id="mailSubject" placeholder="邮件主题" required>
  <textarea id="mailContent" placeholder="邮件内容" required></textarea>
  <button type="button" onclick="sendMail()">发送邮件</button>
</form>

<script>
function sendMail() {
  const formData = new FormData();
  formData.append('userEmail', document.getElementById('userEmail').value);
  formData.append('mailSubject', document.getElementById('mailSubject').value);
  formData.append('mailContent', document.getElementById('mailContent').value);

  fetch('/send-mail', {
    method: 'POST',
    body: formData
  })
  .then(res => res.text())
  .then(msg => alert(msg))
  .catch(err => {
    console.error('发送出错:', err);
    alert('发送失败,请重试');
  });
}
</script>

3. 核对项目结构

确保你的文件层级是这样的:

你的项目文件夹/
├── app.js          # 服务端代码
├── package.json    # Node依赖配置
└── public/         # 静态文件目录
    └── index.html  # 你的前端页面

安装依赖:在项目根目录执行npm install express nodemailer(替换成你用的邮件库)

关键提醒

  • 所有Node.js专属的require和依赖,只能在服务端文件里用,绝对不能写到前端HTML/JS里。
  • 前后端的交互必须通过HTTP请求(GET/POST等),不能直接调用对方环境的函数。

内容的提问来源于stack exchange,提问作者emoleumassi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:17:16