NODEJS+EXPRESS отправка проверочного кода полностью отработана, поход в яму!

Node.js MySQL внешний интерфейс внешний фреймворк

В последнее время я углубленно изучаю разработку полного стека nodejs+express+mysql.Я знаю, что mysql и express уже устарели, но я чувствую, что они достаточно зрелые и знакомые.Давайте сначала изучим это, а затем посмотрим на kao и MongoDB позже. Давайте поговорим о сервисе кодов подтверждения, который я разработал с помощью nodejs и SMS SDK от Tencent Cloud. Бог милостив~.

нужно

Необходимо реализовать требование использования nodejs для отправки кода подтверждения.Один и тот же номер мобильного телефона можно запрашивать только один раз в 180 секунд.

анализировать

Следуйте инструкциям (анализ потребностей стал привычкой ^ _ ^)

  1. Определите, был ли номер мобильного телефона отправлен в течение 180 с. Если он был отправлен, его можно отправить только один раз в течение 180 с, иначе код подтверждения будет пересчитан.
  2. Если номер мобильного телефона никогда не был отправлен, рассчитайте проверочный код.
  3. Сохраните проверочный код.
  4. Отправьте код подтверждения.
  5. Убедитесь, что номер телефона и проверочный код в регистрационных данных совпадают.

выполнить

Отправить код подтверждения

Сначала посмотрите на блок-схему:
alt=

Используется сессионный пакет экспресса, а установка и использование заключаются в следующем:

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

Установить куки по запросу:

Если у вас есть другой способ, пожалуйста, направьте меня.