Node.js之Express(三) web登錄服務:代碼實現

上一篇:Node.js之Express(二) web登錄服務:開發環境搭建

前提:
和朋友ooomyself同學聯手搞了一個小遊戲項目,需要登錄驗證!用web登錄驗證由ooomyself同學提出製作,本人學習(嘿嘿)!
需求:
需要web服務進行註冊登錄驗證。
大致流程:
註冊賬戶(保存到數據庫)->登錄(數據庫查詢驗證)->驗證通過

代碼實現

前面開發環境已經配置完成,具體這裏實現分三個重要部分:
a.路由設置:
b.數據庫鏈接:
c.前後端交互調試:

用webstorm打開創建的webserver項目,進行相應代碼填寫。

1.路由設置:
打開routes文件,裏面的文件我們不用,爲了簡潔我這裏刪掉默認的兩個路由文件,及相應引用。
這裏新建了一個路由管理類route_controller.js代碼如下:

let loginRouter = require('./route_login');

module.exports = function (app) {
    app.use('/', loginRouter);

    //在這裏新添加路由模塊...
};

關於裏面route_login文件,下面會給出,先把這個路由管理類掛到app.js
代碼如下:

//刪掉原有引入index.js, users.js引入,添加引入
let routeCtrl = require('./routes/route_controller');
......
var app = express();
//設置允許跨域訪問該服務.
app.all('*', function (req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    //Access-Control-Allow-Headers ,可根據瀏覽器的F12查看,把對應的粘貼在這裏就行
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    res.header('Access-Control-Allow-Methods', '*');
    res.header('Content-Type', 'application/json;charset=utf-8');
    next();
});

// 刪掉原有index,users調用,添加調用
routeCtrl(app);

接着我們在routes新建rout_login.js文件,填寫代碼如下:

/*
功能:登錄路由
author:yang
date:2019/2/19
*/
let express = require('express');
let router = express.Router();
let util = require('../util/util');
let mgLoginCtrl = require('../models/login/mongo_login');

/* Get users listing. */
router.get('/doReg', function (req, res, next) {
    let arg = req.body;
    let {user, pwd} = arg;
    if (!user || !pwd) {
        util.errResSend(res, '缺少參數');
    } else {
        mgLoginCtrl.regUser(user, pwd, res);
    }
});

router.get('/doLogin', function (req, res, next) {
    let arg = req.body,
        user = arg.user,
        pwd = arg.pwd;
    if (!user || !pwd) {
        util.errResSend(res, '缺少參數!');
    } else {
        mgLoginCtrl.loginUser(user, pwd, res);
    }
});

/* Post users listing*/
router.post('/doReg', function (req, res, next) {
    let arg = req.body;
    let {user, pwd} = arg;
    if (!user || !pwd) {
        util.errResSend(res, '缺少參數');
    } else {
        mgLoginCtrl.regUser(user, pwd, res);
    }
});

router.post('/doLogin', function (req, res, next) {
    let arg = req.body,
        user = arg.user,
        pwd = arg.pwd;
    if (!user || !pwd) {
        util.errResSend(res, '缺少參數!');
    } else {
        mgLoginCtrl.loginUser(user, pwd, res);
    }
});

module.exports = router;

到這裏路由模塊設置完成,細心的小夥伴會發現,route_login文件中引用了好幾個未知文件,不要着急,下面我們慢慢補上。
2.數據庫鏈接
webserver文件目錄下新建models文件目錄:
mkdir data_base
cd data_base
data_base目錄下,新建mongo_controller.js文件,填寫代碼如下:

/*
功能:mongo管理類
author:yang
date:2019/2/19
*/
let loginDefine = require('../models/login/login_define');
let mg_ctrl = require('mongoose');

const DB_URL = 'mongodb://localhost/' + loginDefine.MG_DB_NAME;
mg_ctrl.connect(DB_URL, {useNewUrlParser: true});

let db = mg_ctrl.connection;
db.on('error', console.error.bind(console, 'connection error:'));

db.on('connected', function () {
    console.log('Mongoose connection open to' + DB_URL);
});

db.on('disconnected', function () {
    console.log('Mongoose connection disconnected');
});

db.once('open', function () {
    console.log("we're connected!");
});

module.exports = mg_ctrl;

webserver文件目錄下新建models文件目錄:
mkdir models
cd models
新建login模塊目錄
mkdir login
cd login
新建mongo_login.js文件,填寫代碼如下:

/*
功能:登錄數據管理
author:yang
date:2019/2/19
*/
let loginDefine = require('./login_define');

const DB_LOGIN_TABLE_NAME = loginDefine.DB_LOGIN_TABLE_NAME;
const BASE_ID = loginDefine.INIT_ID;

let mgCtrl = require('../../data_base/mongo_controller');
let util = require('../../util/util');

let schema = mgCtrl.Schema;
let loginMsg = new schema({
    id: Number,
    user: String,
    pwd: String,
});

let loginModel = mgCtrl.model(DB_LOGIN_TABLE_NAME, loginMsg);

let m = {}

m.newUser = function (user, pwd, id, res) {
    let user_model = new loginModel({
        user: user,
        pwd: pwd,
        id: id,
    });
    console.log('user_model...' + user_model);
    user_model.save(function (err) {
        if (err) {
            res.send(util.getResJson(502, '出錯了!'));
        } else {
            res.send(util.getResJson(200, '添加成功'));
        }
    })
}

m.findOne = function (user, res, callback) {
    loginModel.findOne({user: user}, function (err, doc) {
        if (err) {
            util.errResSend(res, err.message);
        } else {
            if (doc) {
                return res.send(util.getResJson(501, "用戶已存在!"))
            } else {
                return callback();
            }
        }
    })
}

m.regUser = function (user, pwd, res) {
    let self = this;
    this.findOne(user, res, function (err, doc) {
        loginModel.countDocuments({}, function (err, doc) {
            if (err) {
                util.errResSend(res, err.message);
            } else {
                console.log(BASE_ID, doc)
                let id = BASE_ID + doc;
                self.newUser(user, pwd, id, res)
            }
        });
    })
}

m.loginUser = function (user, pwd, res) {
    loginModel.findOne({user: user}, function (err, doc) {
        if (err) {
            util.errResSend(res, err.message);
        }
        if (!doc) {
            return res.send(util.getResJson(501, "用戶未註冊"));
        }

        if (pwd == doc.pwd) {
            return res.send(util.getResJson(200, '登錄成功'));
        } else {
            return res.send(util.getResJson(502, '密碼不正確'));
        }
    });
}

module.exports = m;

新建login_define.js文件,填寫代碼如下:

/*
功能:定義常量
author:yang
date:2019/2/19
*/
let m = {
    DB_LOGIN_TABLE_NAME: 'login_db',    //mongodb登錄model表名稱

    WEB_SER_PORT: 3000,                //web服務端口號
    MG_DB_PORT: 27017,                 //mongodb端口號
    MG_DB_NAME: "testdb",              //mongodb實例名稱
    INIT_ID: 10001,                    //默認玩家id
}

module.exports = m;

webserver文件目錄下新建util文件目錄:
mkdir util
cd util
新建util.js文件,填寫代碼如下:

/*
功能:擴展方法
author:yang
date:2019/2/19
*/
let m = {
    errResSend: function (res, errMsg) {
        return res.send('500', errMsg);
    },

    getResJson: function (code, ret) {
        let obj = {
            code: code,
            ret: ret,
        }
        return JSON.stringify(obj);
    },
};

module.exports = m;

到這裏呢,我們的Express服務登錄實現已經基本告一段落。
不過我們發現,login_define文件裏,定義了一個常量WEB_SER_PORT,web服務端口號。爲了用到它,我們打開www.js文件,修改代碼如下:

......
let loginDefine = require('../models/login/login_define');
var port = normalizePort(process.env.PORT || loginDefine.WEB_SER_PORT.toString());
......

最後,我們回過頭來看下,上面都做了寫什麼。現在我們可以得到項目文件如下:

bin						//web服務啓動文件
data_base			//mongodb鏈接文件
models				//功能實現模塊(實現了login模塊的註冊和登錄)
node_modules	//插件或庫安裝目錄
public					//好像是靜態文件目錄,暫時未用到
routes					//路由(處理http請求,實現了route_login路由)
util						//擴展文件(新建了util.js,主要用於路由處理請求時做的一些回調)
views					//暫未用到
app.js					//主文件
package.json		//插件或庫安裝記錄文件
package-lock.json	//插件詳細記錄(個人感覺,不準確)

完整web服務文件下載
至此web登錄服務改寫完成。是不是感覺少些什麼,還沒調試呢!
預知後事如何,請看下篇分見。

下一篇:Node.js之Express(四) web登錄服務:HTML5網頁調試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章