上一篇: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登錄服務改寫完成。是不是感覺少些什麼,還沒調試呢!
預知後事如何,請看下篇分見。