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
相关产品推荐
相关产品推荐

