AstroJS联系表单调用Nodemailer接口报错:无效URL
解决Astro项目中Nodemailer接口URL解析错误问题
你的问题核心是Astro的API端点规则没搞对,src/lib是工具函数目录,不能直接作为后端接口访问,Astro只认src/pages/api/下的文件作为API端点。
修复步骤:
1. 调整Nodemailer文件位置
把src/lib/nodemailer.ts移动到src/pages/api/目录下,重命名为比如send-email.ts(文件名决定了接口路由)。
确保文件导出Astro要求的APIRoute函数,示例代码:
import type { APIRoute } from 'astro'; import nodemailer from 'nodemailer'; export const POST: APIRoute = async ({ request }) => { // 获取表单提交的数据 const formData = await request.formData(); const userEmail = formData.get('email') as string; const userMessage = formData.get('message') as string; // 配置Nodemailer传输器 const transporter = nodemailer.createTransport({ // 替换成你的邮箱服务配置,比如QQ邮箱、Gmail等 host: 'smtp.qq.com', port: 587, secure: false, auth: { user: 'your-qq-email@qq.com', pass: 'your-qq-authorization-code', }, }); // 邮件内容配置 const mailOptions = { from: `"用户反馈" <${userEmail}>`, to: 'your-receive-email@example.com', subject: '来自联系表单的新消息', text: `用户邮箱:${userEmail}\n消息内容:${userMessage}`, }; try { await transporter.sendMail(mailOptions); return new Response(JSON.stringify({ success: true }), { status: 200 }); } catch (err) { return new Response(JSON.stringify({ success: false, error: (err as Error).message }), { status: 500 }); } };
2. 修改表单的提交地址
在contact_us.astro里,把表单的action属性改成对应API路由,比如上面的文件是send-email.ts,路由就是/api/send-email:
<form action="/api/send-email" method="POST"> <label>邮箱:<input type="email" name="email" required /></label> <label>消息:<textarea name="message" rows="5" required></textarea></label> <button type="submit">提交</button> </form>
错误原因说明
你之前用../lib/nodemailer作为提交地址,Astro无法识别这个路径——src/lib目录是用于存放项目内部工具函数的,不会被Astro暴露为可访问的HTTP接口,只有src/pages/api/下的文件会被自动映射为/api/[文件名]的后端路由。
内容的提问来源于stack exchange,提问作者Sebastien Desemberg
相关产品推荐
相关产品推荐

