В последнее время я углубленно изучаю разработку полного стека nodejs+express+mysql.Я знаю, что mysql и express уже устарели, но я чувствую, что они достаточно зрелые и знакомые.Давайте сначала изучим это, а затем посмотрим на kao и MongoDB позже. Давайте поговорим о сервисе кодов подтверждения, который я разработал с помощью nodejs и SMS SDK от Tencent Cloud. Бог милостив~.
нужно
Необходимо реализовать требование использования nodejs для отправки кода подтверждения.Один и тот же номер мобильного телефона можно запрашивать только один раз в 180 секунд.
анализировать
Следуйте инструкциям (анализ потребностей стал привычкой ^ _ ^)
- Определите, был ли номер мобильного телефона отправлен в течение 180 с. Если он был отправлен, его можно отправить только один раз в течение 180 с, иначе код подтверждения будет пересчитан.
- Если номер мобильного телефона никогда не был отправлен, рассчитайте проверочный код.
- Сохраните проверочный код.
- Отправьте код подтверждения.
- Убедитесь, что номер телефона и проверочный код в регистрационных данных совпадают.
выполнить
Отправить код подтверждения
Сначала посмотрите на блок-схему:
Используется сессионный пакет экспресса, а установка и использование заключаются в следующем:
npm install express-session --save
Конфигурация:
app = express();
app.use(session({
secret: '610481',
resave: false,
saveUninitialized: true,
cookie: {
maxAge: 1000*60*30
},
rolling:true
})
);
Выше код: просто пример
selectPhone:(req,res,next) => { //从路由跳到这
let phone = req.body.phone, //获取post参数“话号码”
romStr; //声明随机变量
if(req.session[phone]){ //判断session里面是否存在phone(电话号码,为变量)这个key
if((Date.parse(new Date()) - req.session[phone][1])/1000 > 180){
romStr = RndNum(4);
req.session[phone] = [romStr,Date.parse(new Date())];//存储session
}else{
res.json({msg:"180秒内只能发一条!"})
return //res end以后记得return 否则就报错了
}
}else{
romStr = RndNum(4);
req.session[phone] = [romStr,Date.parse(new Date())];
};
pool.getConnection(function(err, connection) {
// 建立连接
connection.query(userSQL.selectPhone, phone, function(err, result) {
//查询手机号是否被注册,judageRes是一个自己写的方法,用于处理数据库查出来的数据的。处理完之后,返回到回调。
common.judgeRes(result,'query',err,res,function(data){
if(data.data[0]){
data.data = '手机号已注册!'
}else{
//腾讯云的sdk封装,下面有具体写法
sms.ssender(phone,romStr,(req,res,resData)=>{
if (err) {
console.log("err: ", err);
data.data = "验证码发送失败!"
} else {
console.log("request data: ", res.req);
console.log("response data: ", resData);
data.data = "验证码发送成功!"
}
})
}
});
// 释放连接
connection.release();
});
});
}
Облачный SMS-пакет Tencent nodejs sdk:
var QcloudSms = require("qcloudsms_js");
// 短信应用SDK AppID
var appid = xxxxxxx; // SDK AppID是1400开头
// 短信应用SDK AppKey
var appkey = "xxxxxxx";
// 短信模板ID,需要在短信应用中申请
var templateId = 7839; // NOTE: 这里的模板ID`7839`只是一个示例,真实的模板ID需要在短信控制台中申请
//templateId 7839 对应的内容是"您的验证码是: {1}"
// 签名
var smsSign = "XX"; // NOTE: 这里的签名只是示例,请使用真实的已申请的签名, 签名参数使用的是`签名内容`,而不是`签名ID`
// 实例化QcloudSms
var qcloudsms = QcloudSms(appid, appkey);
var ssender = qcloudsms.SmsSingleSender();
module.exports = {
/*
* @params phoneNumbers [Array or String]
* @params params [Array]
* @params callback(req res resData)
*/
ssender:(phoneNumbers,params,callback) => {
ssender.sendWithParam(86, phoneNumbers,templateId,params,smsSign, "", "", callback);
}
}
яма
Так как я использовал почтальон для тестирования интерфейса, то всегда приходил к шагу что телефона не существует.По прошествии долгого времени я обнаружил, что ответ будет set-cookie.Почтальон не браузер и не будет нести это в следующем запросе , так что надо тестить.Вручную ставить куки самостоятельно.
Это ответconnect.sid
Установить куки по запросу:
Если у вас есть другой способ, пожалуйста, направьте меня.