问一下,我在后端的node.js里面写了发送短信验证码和验证的功能,并且利用apifox测试可以正常发送验证码并验证,但是到了前端后就一直是可以发送验证码,但是一直提示验证码错误
(以下为后端ali.js代码)
const express = require('express');
const { Yzm } = require('../models'); // 确保 Yzm 模型已正确导入
const router = express.Router();
const Core = require('@alicloud/pop-core');
const client = new Core({
accessKeyId: 'L12345',
accessKeySecret: 'ddddd',
endpoint: 'https://dysmsapi.aliyuncs.com',
apiVersion: '2017-05-25'
});
// 生成随机验证码
function generateCode() {
const code = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000;
return code.toString();
}
// 验证手机号码格式
function isValidPhoneNumber(phoneNumber) {
const phoneRegex = /^1[3-9]\d{9}$/;
return phoneRegex.test(phoneNumber);
}
// 发送短信验证码
router.post('/url', async (req, res) => {
const phoneNumber = req.body.phone;
if (!isValidPhoneNumber(phoneNumber)) {
return res.status(400).json({
message: '手机号码格式错误'
});
}
const code = generateCode();
try {
// 保存验证码和手机号码到数据库
await Yzm.create({ phone: phoneNumber, yzm: code });
const params = {
"RegionId": "cn-beijing",
"PhoneNumbers": phoneNumber,
"SignName": "456",
"TemplateCode": "789",
"TemplateParam": JSON.stringify({ "code": code })
};
const requestOption = {
method: 'POST',
timeout: 6000
};
await client.request('SendSms', params, requestOption);
res.status(200).json({
message: '验证码已发送,请注意查收!'
});
} catch (ex) {
console.log(ex);
res.status(500).json({
message: '短信发送失败,请稍后重试!'
});
}
});
// 验证验证码
router.post('/yanzm-code', async (req, res) => {
const { phone, code: inputCode } = req.body;
try {
if (!phone || !inputCode) {
return res.status(400).json({ message: '请求体中缺少必要的参数' });
}
const verification = await Yzm.findOne({ where: { phone: phone } });
if (verification && verification.yzm === inputCode) {
res.status(200).json({ message: '验证成功!' });
} else {
res.status(400).json({ message: '验证码错误,请重新输入!' });
}
} catch (ex) {
console.log(ex);
res.status(500).json({ message: '服务器错误,请稍后再试。' });
}
});
module.exports = router;
(以下为前端vue代码)
<template>
<div class="sign-in">
<el-row>
<el-col :span="12" :offset="6">
<h1>经书用户后台 - 用户注册</h1>
<el-form
ref="formRef"
:model="form"
:rules="rules"
label-width="120px"
class="demo-ruleForm"
status-icon
>
<el-form-item label="手机号码" prop="phone">
<el-input v-model="form.phone" placeholder="请输入11位手机号码" />
</el-form-item>
<el-form-item label="验证码">
<el-input v-model="form.code " placeholder="请输入验证码" />
<el-button type="primary" @click="sendVerificationCode">获取验证码</el-button>
</el-form-item>
<el-form-item label="昵称" prop="username">
<el-input v-model="form.username" placeholder="请输入昵称(可不填写)"/>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="form.password" type="password" placeholder="请输入6-45位密码,请务必牢记" />
</el-form-item>
<el-form-item label="再次输入密码" prop="passwordConfirmation">
<el-input v-model="form.passwordConfirmation" type="password" placeholder="请再次输出密码"/>
</el-form-item>
<el-divider />
<el-form-item>
<el-button
type="primary"
@click="submitForm(formRef)"
>
提交
</el-button>
<el-button @click="resetForm(formRef)">重置</el-button>
</el-form-item>
</el-form>
</el-col>
</el-row>
<el-row>
<el-col :span="12" :offset="6">
<router-link to="/login">已有账号,立即登录</router-link>
</el-col>
</el-row>
</div>
</template>
<script setup>
import { ref } from "vue";
import { register } from '@/api/auth.js'
import { ElMessage } from 'element-plus'
import { useRouter } from 'vue-router'
import axios from 'axios'; // 引入axios用于发送HTTP请求
const router = useRouter();
const formRef = ref(null);
const form = ref({
username: '',
phone: '',
code: '', // 验证码
sex: 2,
password: '',
role: 0,
passwordConfirmation: '',
});
const rules = ref({
phone: [
{ required: true, message: '请填写手机号', trigger: 'blur' },
{ type: 'phone', message: '号码格式不正确', trigger: 'blur' }
],
username: [
{ required: false, message: '请填写用户名', trigger: 'blur' },
{ min: 2, max: 10, message: '长度在2~10个字符', trigger: 'blur' }
],
password: [
{ required: true, message: '请填写密码', trigger: 'blur' },
{ min: 6, max: 45, message: '长度在6~45个字符', trigger: 'blur' }
],
passwordConfirmation: [
{ required: true, message: '请再次输入密码', trigger: 'blur' },
{ validator: validatePasswordConfirmation, trigger: 'blur' }
],
verificationCode: [
{ required: true, message: '请输入验证码', trigger: 'blur' }
]
});
//发送验证码
const sendVerificationCode = async () => {
const phoneNumber = form.value.phone;
if (!phoneNumber) {
ElMessage.error('请先填写手机号码');
return;
}
try {
const response = await axios.post('http://localhost:3000/ali/url', { phone: phoneNumber });
if (response.data.message) {
ElMessage.success(response.data.message);
}
} catch (error) {
console.error('发送验证码失败:', error);
ElMessage.error('发送验证码失败,请稍后再试');
}
};
// 二次密码验证
function validatePasswordConfirmation(rule, value, callback) {
if (value === '') {
callback(new Error('请再次输入密码'));
} else if (value !== form.value.password) {
callback(new Error('两次输入的密码不一致'));
} else {
callback();
}
}
// 提交表单
const submitForm = async (formEl) => {
if (!formEl) return;
await formEl.validate(async (valid) => {
if (valid) {
try {
// 发送请求,确保字段名称与后端一致
const response = await axios.post('http://localhost:3000/ali/yanzm-code', {
phone: form.value.phone,
code: form.value.code
}, {
headers: {
'Content-Type': 'application/json'
}
});
// 处理响应
if (response.data.success) {
const res = await register(form.value);
ElMessage.success(res.message);
await router.push({ path: "/login" });
} else {
ElMessage.error('验证码错误,请重新输入');
}
} catch (error) {
console.error('验证验证码失败:', error);
ElMessage.error('验证验证码失败,请稍后再试');
}
}
});
};
// 重置
const resetForm = (formEl) => {
if (!formEl) return;
formEl.resetFields();
};
</script>
<style scoped>
.sign-in {
margin-top: 50px;
text-align: center;
}
</style>