美文网首页
express+mongodb开发小程序后台(一)

express+mongodb开发小程序后台(一)

作者: 逆_旅 | 来源:发表于2017-12-19 23:53 被阅读0次

    之前鼓捣过一段时间小程序,准备用node和mongodb做小程序的后台,漫漫采坑路,今天开始第一步,先从小程序登录开始踩,如有不足之处,望指点。

    小程序端

    • 小程序端的逻辑比较简单
      1 . 从缓存中读取token,如果有则说明用户已经登陆过小程序了
      2 . 如果没有token,则说明用户第一次登录,拿到用户的code,在服务端获取openid,同时生成token,返回前端,保存到本地
    App({
      onLaunch: function () {
        //调用api从本地缓存中获取token
        var token = wx.getStorageSync('token') || '';
        console.info('从本地缓存中获取token数据')
        if(token == null || token == ''){
          var that = this;
          console.info('token is null');
          that.login();
        }else{
          console.info('token is not null');
        }
      },
      //登录接口,登陆成功后设置全局用户信息
      login:function(){
        //获取授权码code
        wx.login({
          success: function (res) {
            console.info('授权码code')
            var code = res.code;
            console.info(code);
            if (code) {
              //获取用户信息接口
              wx.getUserInfo({
                success: function (res) {
                  var userInfo = res.userInfo;
                  var nickName = userInfo.nickName;
                  var avatarUrl = userInfo.avatarUrl;
                  //调用后端登录接口
                  wx.request({
                    url: 'http://127.0.0.1:3000/login',
                    data: {
                      nickName: nickName,
                      avatarUrl: avatarUrl,
                      code:code
                    },
                    success:function(res){
                      console.info(res.data);
    
                      wx.setStorageSync('token', res.data.usertoken)
                    },
                    fail:function(res){
                      console.info('获取token失败');
                      console.info(res);
                    }
                  })
                }
              })
            } else {
              console.info('获取用户登录凭证失败');
            }
          }
        })
      },
      globalData: {
        userInfo: null
      }
    })
    

    服务端

    目录结构
    • 项目目录简单说明
      • db 数据库目录,使用的是mongodb数据库
      • models 数据库模型
      • schemas 定义mongodb的数据结构
      • routes 路由文件
        • mongodb_connect.js 定义所有与数据库操作相关的类
        • login.js 小程序登录的api
    • mongodb_connect.js

    login函数传入三个参数, nickName(微信昵称),avatarUrl(头像),code(code凭证)

    class Database {
        constructor() {
    
        }
        //获取用户登录信息
        login(res, nickName, avatarUrl, code) {
            //生成token
            function createToken() {
                const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
                const length = chars.length;
                let str = "";
                for (let i = 0; i < length; i++) {
                    str += chars.substr(Math.round(Math.random() * length), 1);
                }
                return str;
            };
            request.get({
                url: 'https://api.weixin.qq.com/sns/jscode2session',
                json: true,
                qs: {
                    grant_type: 'authorization_code',
                    appid: '开发者的APPID',
                    secret: '开发者的APPSECRET',
                    js_code: code
                }
            }, function (err, response, data) {
                var openid = data.openid;
                User.findOne({
                    openid: openid
                }, function (err, result) {
                    if (result) {
                        res.send({
                            usertoken: result.token
                        })
                    } else {
                        var user = new User({
                            openid:openid,
                            nickName: nickName,
                            avatarUrl: avatarUrl,
                            creatAt: moment().format('YYYY-MM-DD HH:mm:ss'),
                            token:createToken()
                        }).save(function (err, result) {
                            res.send({
                                usertoken: result.token
                            })
                        });
                    }
                })
            })
    
        }
    }
    
    • login.js
      • 小程序端访问接口http://127.0.0.1:3000/login,请求方式为GET,服务端接收nickNameavatarUrlcode
    router.get('/',function(req,res,next){
      var nickName = req.query.nickName;
      var avatarUrl = req.query.avatarUrl;
      var code = req.query.code
      new Database().login(res,nickName,avatarUrl,code);
    })
    

    至此,小程序登录接口完成


    tips

    • 对于token的生成,我暂时定义了一个函数createToken函数
    function createToken() {
      const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
      const length = chars.length;
      let str = "";
      for (let i = 0; i < length; i++) {
        str += chars.substr(Math.round(Math.random() * length), 1);
      }
      return str;
    };
    
    • 之后可能会把openid进行MD5加密,将加密后的值作为token存进数据库。


    第一次写简书,不足之处,忘见谅


    相关文章

      网友评论

          本文标题:express+mongodb开发小程序后台(一)

          本文链接:https://www.haomeiwen.com/subject/rrrwwxtx.html