// Next.js API route support: https://nextjs.org/docs/api-routes/introduction import type { NextApiRequest, NextApiResponse } from 'next'; import { jsonRes } from '@/service/response'; import { AuthCode } from '@/service/models/authCode'; import { connectToDatabase, User } from '@/service/mongo'; import { sendCode } from '@/service/utils/sendEmail'; import { EmailTypeEnum } from '@/constants/common'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { const { email, type } = req.query as { email: string; type: `${EmailTypeEnum}` }; if (!email || !type) { throw new Error('缺少参数'); } await connectToDatabase(); // 注册人数限流 if (type === EmailTypeEnum.register) { const maxCount = process.env.MAX_USER ? +process.env.MAX_USER : Infinity; const userCount = await User.count(); if (userCount >= maxCount) { throw new Error('当前注册用户已满,请等待名额~'); } } let code = ''; for (let i = 0; i < 6; i++) { code += Math.floor(Math.random() * 10); } // 判断 1 分钟内是否有重复数据 const authCode = await AuthCode.findOne({ email, type, expiredTime: { $gte: Date.now() + 4 * 60 * 1000 } // 如果有一个记录的过期时间,大于当前+4分钟,说明距离上次发送还没到1分钟。(因为默认创建时,过期时间是未来5分钟) }); if (authCode) { throw new Error('请勿频繁获取验证码'); } // 创建 auth 记录 await AuthCode.create({ email, type, code }); // 发送验证码 await sendCode(email as string, code, type as `${EmailTypeEnum}`); jsonRes(res, { message: '发送验证码成功' }); } catch (err) { jsonRes(res, { code: 500, error: err }); } }