我无法在nuxt 3中通过nodemailer发送表单

问题描述 投票:0回答:1

我的 contact.post.js 在 server/api 目录中。我已经尝试通过邮递员发布它,但现在出了问题,我收到了 500 错误。 POSThttp://localhost:3000/api/contact[HTTP/1.1 500 内部服务器错误 19ms]。我真的不知道该怎么办,希望有人能帮助我


import nodemailer from 'nodemailer';
import validator from 'validator';
const config = useRuntimeConfig();

const transporter = nodemailer.createTransport({
    host: config.MAILHOST,
    port: config.MAILPORT,
    auth: {
        user: config.MAILUSER,
        pass: config.MAILPASSWORD,
    },
});

export default defineEventHandler(async (event) => {
    try {
        const body = await readBody(event);

        await isValid(body)
            .then(async (data) => {
                const mail = await transporter.sendMail({
                    form: `"${data.name}" <${data.email}>`,
                    to: config.CONTACTMAIL,
                    subject: data.comment,
                    text: data.comment,
                    html: data.message,
                });

                console.log('Message sent: %s', mail.messageId);
                console.log('Preview URL: %s', nodemailer.getTestMessageUrl(mail));
                return Promise.resolve();
            })
            .catch((errors) => {
                return Promise.reject(errors);
            });

        return 'Gesendet!';
    } catch (error) {
        sendError(event, createError({ statusCode: 400, statusMessage: error }));
    }
});

async function isValid(body) {
    const errors = [];

    if (validator.isEmpty(body.name || ''))
        errors.push({
            field: 'name',
            error: 'Field is required.',
        });
    if (validator.isEmpty(body.phone || ''))
        errors.push({ 
        field: 'phone', 
        error: 'Field is required.'
     });
    if (validator.isEmail(body.email || ''))
        errors.push({ 
        field: 'email',
        error: 'Field is required.' 
    });
    if (validator.isEmpty(body.budget || ''))
        errors.push({ 
        field: 'budget',
        error: 'Field is required.' 
    });
    if (!validator.isEmpty(body.comment || ''))
        errors.push({ 
        field: 'comment', 
        error: 'Field should be a valid .' 
    });

    if (errors.length > 0) {
        return Promise.reject(errors);
    } else {
        return Promise.resolve({
            email: validator.normalizeEmail(body.email),
            name: validator.escape(body.name),
            phone: validator.escape(body.phone),
            budget: validator.escape(body.budget),
            comment: validator.escape(body.comment),
        });
    }
}

form.vue 的组件没有发生任何事情

<template>
  <div class="m-3 lg:m-1">
    <form @submit.prevent="submit(form)">
      <div id="form" class="flex tad">
        <div class="forma w-1/3 m-8">
          <h1 class="text-volna send text-4xl mb-3">Оставь заявку</h1>
          <div action="" method="POST">
            <p class="text-white">Ваше ФИО</p>
            <input
              v-model="form.name"
              name="name"
              class="inp"
              type="text"
              placeholder="введите ваше имя"
            />
            <p class="text-white">Ваш номер телефона</p>
            <input
              v-model="form.phone"
              name="phone"
              class="inp"
              type="text"
              placeholder="Ввведите номер для связи с вами"
            />
            <p class="text-white">Ваш email</p>
            <input
              name="email"
              v-model="form.mail"
              class="inp"
              type="email"
              placeholder="введите контактный email"
            />
          </div>
        </div>
        <div class="forma w-1/3 m-8">
          <div class="sec_forma">
            <div class="">
              <p class="text-white">Ваш бюджет</p>
              <input
                v-model="form.budget"
                name="money"
                class="inp"
                type="text"
                placeholder="введите ваш бюджет"
              />
              <p class="text-white">Введите Ваш комментарий (по желанию)</p>
              <input
                v-model="form.comment"
                name="comment"
                class="inp"
                type="text"
                placeholder=" ваш комментарий"
              />
              <button
                @click="submit(form)"
                type="submit"
                class="button button-1 mb-3"
              >
                отправить
              </button>
            </div>
          </div>
        </div>
           
      </div>
    </form>
  </div>
</template>

<script setup>
const form = ref({
  name: '',
  phone: '',
  email: '',
  budget: '',
  comment: '',
});

const errors = ref(false);
const success = ref(false);
const waiting = ref(false);

async function submit(form) {
  waiting.value = true;
  await $fetch('http://localhost:3000/api/contact', {
    method: 'POST',
    body: JSON.stringify(form.value),
  }).then(() => {
    errors.value = false;
    success.value = true;
    waiting.value = false;
    form.value = {
      name: '',
      phone: '',
      email: '',
      budget: '',
      comment: '',
    };
    
  }).catch(() => {
    errors.value = true;
    success.value = false;
    waiting.value = false;
  });
}

</script>
javascript vue.js nuxt.js nodemailer nuxtjs3
1个回答
0
投票

在您的代码中,您使用 .then() 和 .catch() 来处理 Promise。确保正确捕获并记录任何未处理的承诺拒绝。您可以添加全局 unhandledRejection 事件处理程序来捕获未处理的承诺拒绝并记录它们:

process.on('unhandledRejection', (原因, 承诺) => {
console.error('未处理的拒绝:',promise,'原因:',reason); });

© www.soinside.com 2019 - 2024. All rights reserved.