Электронное письмо с подтверждением учетной записи

#node.js #mongodb #vue.js #vuetify.js

Вопрос:

введите описание изображения здесь

У меня есть проект, и в этом проекте я хочу сначала создать страницу регистрации, поэтому у меня есть следующий сценарий: когда пользователь нажимает кнопку Регистрация , отображается сообщение о том, что сообщение отправлено на его электронную почту, сообщение отправляется на его электронную почту, и он должен перейти на свою электронную почту, чтобы подтвердить свою электронную почту и подтвердить свою учетную запись на моем сайте, но если сообщение не отправлено, он должен, чтобы пользователь мог нажать на кнопку «Отправить ссылку активации», которая появляется на картинке. проблема в том, что существует этот api, который был создан на задней стороне для использования на передней стороне:

            router.get('/reactivate/:email', accountController.resendActivationLink);
 

Этот api полезен, когда вы нажимаете «Отправить ссылку активации повторно», чтобы отправить сообщение на электронную почту.
Но на лицевой стороне есть ошибка, так как сообщение не отправляется, отмечая, что я не знал, как отправить api.
Это код «подтверждающей почты», означающий этот интерфейс, созданный с помощью VueJS.
Как решается эта проблема?
Подтверждающая почта.Vue:

 <template>
  <v-container class="mt-10">
    <v-layout row class="padding mb-9 ">
      <v-flex xs3 sm5 offset-sm3>
        <v-card
          class="mx-auto mt-5 pa-5 text-center secondary"
          max-width="1000"
          max-height="2000px"
          id="limited-products"
          outlined
        >
          <v-btn class="ma-2 mt-10 ml-10 mr-10 icon-size" outlined fab color="blue" large>
            <v-icon large class="icon-size" color="blue darken-2">
              mdi-email
            </v-icon>
          </v-btn>

          <v-layout row class="pt-10">
            <v-flex xs12>
              <div class="text-center phase-style">
                Verify Your email address
              </div>
            </v-flex>
          </v-layout>

          <span class="SeparatorRow LoginDefaultView-separatorRow pt-6 ml-15 mr-15"
            ><span class="SeparatorRow-horizontalLine"></span
            ><span class="SeparatorRow-horizontalLine"></span
          ></span>

          <v-layout row class="p-long-style pt-6 ml-15 mr-15">
            <v-flex xs12>
              <div>
                We sent you an email to verify the email. Please check the email
                to activate your account. 
                
                <div class="mt-10 p-size">If you do not receive any message on
                your email, press the button to resend the message again.</div>
              </div>
            </v-flex>
          </v-layout>

          <v-layout row>
            <v-flex xs12 class="pt-8 pb-8  ml-15 mr-15">
              <v-btn
                @click="onConfirmEmail"
                class="blue darken-2 color myfont font-weight-bold "
                align="center"
                justify="center"
                block
                large
              >
                Resend Activation Link
              </v-btn>
            </v-flex>
          </v-layout>

          <span class="SeparatorRow LoginDefaultView-separatorRow pt-6">
            <span class="SeparatorRow-horizontalLine1"></span
          ></span>
        </v-card>
      </v-flex>
    </v-layout>
  </v-container>
</template>

<script>
import { mapActions } from "vuex";
import ActionsTypes from "../store/types/actions-types";

export default {
    
    methods:{
         ...mapActions({
      confirmEmail: ActionsTypes.GET_REACTIVATION_EMAIL_ACTION
    }),
        onConfirmEmail(){

      this.confirmEmail()
        .then((res) => {
          console.log("This is the result to Verify Email:" ,res);
            this.$router.push("/signin");
        })
        .catch((error) => {
          console.log(error);
        });

        }
    }
}
</script>
<style scoped>
.button {
  background: #b92c28 !important;
  color: aliceblue !important;
  display: flex;
}

.myfont {
  font-family: "Mansalva", cursive;
  color: #e8ecee;
}

.color {
  color: #fafafa;
}

.padding {
  padding-top: 30px;
}

.icon-size {
  font-size: 40px;
}

.phase-style {
  font-size: 28px;
}

.p-long-style{
    font-size: 19px;
}

.p-size{
  font-size: 14px;
}
.SeparatorRow {
  align-items: center;
  display: flex;
  text-align: center;
}

.SeparatorRow-horizontalLine {
  border-top: 1px solid #e8ecee;
  flex: 1 1 auto;
  margin-top: 8px;
  min-width: 1px;
  padding-top: 8px;
}

.SeparatorRow-horizontalLine1 {
  border-top: 1px solid #e8ecee;
  flex: 0.1 0.1 auto;
  margin-top: 8px;
  min-width: 0.5px;
  padding-top: 8px;
}

.LoginDefaultView-separatorRowLabel {
  color: #cbd4db !important;
  font-size: 16px;
}
</style>
 

И это Файл действий.
actions.js:

 import { email } from "vuelidate/lib/validators";
import api from "../../../../axiosWithDelimiterFile";
import ActionsTypes from "../types/actions-types"
import MutationsTypes from '../types/mutations-types'
const actions ={
      async [ActionsTypes.GET_REACTIVATION_EMAIL_ACTION](_, userData) {
        console.log('userData: ', userData);
        email = userData.email;
        return new Promise((resolve, reject) => {
          api
            .post("/account/reactivate/", email)
            .then((response) => {
              console.log("The request is successed")
              resolve(response);
            })
            .catch((error) => {
              console.log(error);
              reject(error);
            });
        });
      }
}
export default actions;
 

И этот файл, по которому api определяется с внутренней стороны, и это NodeJS.
account.route.js:

 const express = require("express");
const router = express.Router()
const accountController = require('../controllers/account.controller');
router.get('/reactivate/:email', accountController.resendActivationLink);       
module.exports = router;
 

И это функция повторной отправки сообщения на электронную почту через серверную часть, которая является NodeJS.
account.controller.js:

 const userService = require("../services/user.service");
const operationsCodes = require("../utils/operations-codes");

module.exports = {
  resendActivationLink: async (req, res) => {
    const email = req.params.email;
    const response = await userService.resendActivationLink(email);
    return res
    .status(operationsCodes.getResponseCode(response.code))
    .json(response);
  }
};
 

Ответ №1:

Хорошее начало для этого! Однако похоже, что вы, возможно, неправильно вызываете свою точку доступа API. Рассматриваемая конечная '/reactivate/:email' точка подразумевает, что вам нужно использовать конечную точку следующим образом:

api.get('/reactivate/user@gmail.com')

вместо

api.post("/account/reactivate/", email)

и ваш API обработает этот адрес электронной почты как req.params.email .

Обратите внимание, что я использую GET запрос, а не POST запрос, и просто включаю адрес электронной почты и часть конечной точки.

Комментарии:

1. Нет, это мне не помогло, Вопрос в том,что у меня ошибка при использовании этого api и передаче электронной почты в файле подтверждающей почты, Как я могу передать электронную почту в файле «Подтверждающая почта».

2. Извини, я неправильно понял. Тебе нужно уметь звонить this.confirmEmail(this.email) . Это означает, что в вашем компоненте Vue ( confirmEmail.Vue ) у вас должен быть вызван data член email . Хотя я не уверен, как вы можете получить это электронное письмо. У вас есть это в URL-адресе? Как вы узнаете, на какое электронное письмо отправлять?