安装mongodb
参考 http://www.runoob.com/mongodb...
推荐使用 brew 安装
安装完成后运行mongodb
配置数据库,启动服务端
1.安装mongoose
使用npm下载模块时候会发现很慢,所以推荐淘宝的镜像。
cnpm i mongoose --save
2.在index.js中连接数据库
// 加载数据库模块
const mongoose = require("mongoose");
mongoose.connect('mongodb://localhost:27017/testblog',function(err){
if(err){
console.log('数据库连接失败');
}else{
console.log('数据库连接成功');
app.listen(4000);
}
});
这里的testblog 是我们创建的数据库名称,终端运行node . 或者node index.js 打印数据库连接成功就说明服务已经启动
注册接口实现
1.在写接口之前还需要安装一个body-parser插件,body-parser是非常常用的一个express中间件,作用是对post请求的请求体进行解析。
cnpm i body-parser --save
在index.js中引入
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
2.在routers下新建user.js,配置路由
const express = require('express');
const router = express.Router();
router.get('/regiest', function(res, rep) {
rep.send('Hello, word!');
});
module.exports = router;
在index.js中使用app.use('/user',require('./routers/user'));这种方式加载路由
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
// 注意解析要放在上面
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use('/user',require('./routers/user'));
// 加载数据库模块
const mongoose = require("mongoose");
mongoose.connect('mongodb://localhost:27017/testblog',function(err){
if(err){
console.log('数据库连接失败');
}else{
console.log('数据库连接成功');
app.listen(4000);
}
});
重新启动服务,在浏览器中输入http://localhost:4000/user/regiest,可以看到打印信息说明路由配置成功。
3.在schemas文件夹下新建user.js , 用户相关的Schema
var mongoose = require('mongoose')
module.exports = new mongoose.Schema({
// 用户名
userName: String,
// 密码
passWord: String,
// 注册日期
creatDate: Date,
token: String
})
4.在models文件夹下新建user.js, 创建用户相关的模型,数据库的相关操作都是通过models下面我们创建的模型来操作的。
var mongoose = require('mongoose')
var userSchema = require('../schemas/user')
module.exports = mongoose.model('User', userSchema)
5.注册接口
router.post('/regiest', function(req, res, next) {
var userName = req.body.userName
var password = req.body.passWord
var rePassWord = req.body.rePassWord
if (userName === '') {
responseData.success = false
responseData.message = '用户名不能为空'
res.json(responseData)
return
}
if (password === '') {
responseData.success = false
responseData.message = '密码不能为空'
res.json(responseData)
return
}
if (password !== rePassWord) {
responseData.success = false
responseData.message = '两次输入的密码不一致'
res.json(responseData)
return
}
User.findOne({
userName: userName
}).then((userInfo) => {
if (userInfo) { // 数据库中有
responseData.success = false
responseData.message = '该用户已存在'
res.json(responseData)
return
} else {
// 写入数据库
//获取hash值 密码加密
var hash = bcrypt.hashSync(password, 10)
//把hash值赋值给password变量
password = hash
var user = new User({
userName: userName,
passWord: password,
creatDate: new Date(),
})
return user.save()
}
}).then((newUserInfo) => {
responseData.success = true
responseData.message = '恭喜您,注册成功'
responseData.data = {
userName: newUserInfo.userName,
userId: newUserInfo._id
}
res.json(responseData)
})
});
其中bcrypt是加密相关的库
cnpm i bcrypt --save
重启服务,测试注册接口。
6.启动blogclient,我们现在页面上放置几个简单的文本框来测试登录接口,关于blogclient的具体网络配置部分可参考具体的demo
7.登录接口的要注意的是token的生成规则,依赖框jsonwebtoken和express-jwt
cnpm i jsonwebtoken --save
cnpm i express-jwt --save
// 登录
const jwt = require('jsonwebtoken');
router.post('/login', function (req, res, next) {
var userName = req.body.userName
var password = req.body.passWord
User.findOne({
userName: userName
}).then((userInfo) => {
if (userInfo) {
// 判断密码是否正确
const pwdMatchFlag = bcrypt.compareSync(password, userInfo.passWord);
if (pwdMatchFlag) {
responseData.success = true
responseData.message = '登录成功'
responseData.data = {
userName: userInfo.userName,
userId: userInfo._id,
// token 有效期12h(60 * 60 * 12)
token: jwt.sign({
data: {_id:userInfo._id,username:userInfo.userName},
exp: Math.floor(Date.now() / 1000) + (60 * 60 * 12)
}, 'jwt-secret')
}
res.json(responseData)
return
} else {
responseData.success = false
responseData.message = '密码错误'
res.json(responseData)
return
}
} else {
responseData.success = false
responseData.message = '该用户不存在'
res.json(responseData)
return
}
})
});
在index.js中导入
var jwt = require('express-jwt');
// token相关regiest和login不需要token验证
var jwt = require('express-jwt');
app.use(jwt({secret: 'jwt-secret', debug: true}).unless({
path: ['/user/regiest', '/user/login']
}))