Nextjs 13错误:尝试读取未定义的属性(读取'headers')
P粉652495194
P粉652495194 2023-08-31 16:47:14
[React讨论组]

在我的Nextjs中创建的post API端点的标题中遇到了问题。

我的端点用于表单提交,我将输入转发到我的电子邮件。我的当前代码可以发送电子邮件,并且我可以在我的电子邮件中正常接收到它,但是每次我发出请求时,它都会返回标题中的错误。

import { NextResponse, NextRequest } from "next/server"
import nodemailer from "nodemailer"

export async function POST(request: NextRequest, response: NextResponse) {
  const formData = await request.formData()

  const emailValue = formData.get("email")
  const messageValue = formData.get("message")
  const numberValue = formData.get("phone_number")

  if (!messageValue || !numberValue || !emailValue) {
    return NextResponse.json({ message: "请填写所有必填字段!" }, { status: 400 })
  }

  const transporter = nodemailer.createTransport({
    service: "gmail",
    auth: {
      user: process.env.EMAIL,
      pass: process.env.PASSWORD,
    },
    tls: {
      rejectUnauthorized: false,
    },
  })

  const mailOptions = {
    from: `${emailValue}`,
    to: `${process.env.EMAIL}`,
    subject: `来自联系我页面的消息 ${numberValue} - ${emailValue} `,
    text: `${messageValue}`,
  }

  transporter.sendMail(mailOptions, (err, info) => {
    if (err) {
      return NextResponse.json({ message: `${err}` }, { status: 500 })
    }
    return NextResponse.json({ message: "电子邮件发送成功!" }, { status: 200 })
  })
}

我不确定我做错了什么。我在一个线程中读到过关于在return语句中执行NextResponse的内容,但即使这样也没有起作用。

我得到的错误信息:

- 错误 TypeError: 无法读取未定义的属性(读取'headers')
    at eval (webpack-internal:///(sc_server)/./node_modules/next/dist/server/future/route-modules/app-route/module.js:261:61)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

P粉652495194
P粉652495194

全部回复(1)
P粉226413256

我会说问题与这个问题有关。

你最后两个return NextResponse...调用在transporter.sendMail()回调内部,所以它们不会从POST()函数中返回。

利用Nodemailer的返回promise的能力,而不是使用回调函数...

try {
  await transporter.sendMail(mailOptions);
  return NextResponse.json(
    { message: "邮件发送成功!" },
    { status: 200 },
  );
} catch (err) {
  return NextResponse.json({ message: err.toString() }, { status: 500 });
}

另一种方法是将Nodemailer的回调转换为promise,尽管在我看来这样做不够简洁

return new Promise((resolve) => {
  transporter.sendMail(mailOptions, (err) => {
    const status = err ? 500 : 200;
    const message = err?.toString() ?? "邮件发送成功!";
    resolve(NextResponse.json({ message }, { status }));
  });
});
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号