这里开始实现登录注册模块了,其实这一块算是比较简单的了,主要就是路径的问题。
- 我们需要使用到bodyParser来处理请求的数据,所以这里需要安装一下:
npm install body-parser --save
- 成功以后,在app.js中引入:
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
- 然后继续在app.js中添加引擎模板,这个不是一定的,看自己情况改:
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
- 添加路由,此时需在根目录下添加一个routes的文件夹,在文件夹下新建users.js和articles.js文件,一个处理用户登录注册的请求路径,一个管理文章的路径,然后在app.js中添加:
var articleRouter = require('./routes/articles');
var userRouter = require('./routes/users');
app.use('/home', articleRouter);
app.use('/', userRouter);
这里说明一下,这里设置完以后进入到user的路径则直接为user里设置的路径,而article中的路径则需要在前加入home方可访问,即http://localhost:端口号/home/你设置的路径
- 注册请求实现:
const express = require('express');
//验证信息,使用前需npm install安装
const { check, validationResult } = require('express-validator');
//引入之前写好的user的数据库
let User = require('../models/user');
let router = express.Router();
// 注册
router.post('/reg', [
//检测传入数据是否为空等
check('username').isLength({ min: 1 }).withMessage('Username is required'),
check('email').isLength({ min: 1 }).withMessage('Email is required'),
check("password", "invalid password")
.isLength({ min: 1 })
.custom((value,{req, loc, path}) => {
return value;
})
],function (req, res){
//这里可以输出在后端看一下,req.body即为前端传入的参数
console.log("test", req.body);
//username是唯一的,所以注册需要判断一下是否存在
User.findOne({
username: req.body.username
}, (err, data) => {
if(err){
res.send('server or db error');
}else{
//未重复
if(data === null){
//errors是记录的前面检测的结果,若不为空,说明检测不通过
const errors = validationResult(req);
if (!errors.isEmpty()) {
console.log(errors);
if(errors.errors[0].param == 'username'){
res.json({code: 0});
}else if(errors.errors[0].param == 'email'){
res.json({code: 1});
}else{
res.json({code: 2});
}
} else {
let user = new User({
username: req.body.username,
email: req.body.email,
password: req.body.password,
});
//存入数据到数据库中
user.save(function(err) {
if (err) {
res.json({code: 3});
} else {
console.log('save success!');
//返回json到前端
res.json({code: 200});
}
});
}
}else{
res.json({code: 500});
}
}
});
});
//打包模块
module.exports = router;
- 注册前端请求
$.ajax({
type: 'POST',
url: 'http://127.0.0.1:8082/api/reg',
data: user,
success: function(data) {
switch(data.code){
case 0:
$("#addmsg").text("用户名不能为空");
break;
case 1:
$("#addmsg").text("邮箱不能为空");
break;
case 2:
$("#addmsg").text("密码不能为空");
break;
case 3:
$("#addmsg").text("数据库发生错误,请重新注册");
break;
case 500:
$("#addmsg").text("用户名已存在");
break;
}
}
});
- 登录请求路径:
router.post('/login', function (req, res){
User.findOne({
username: req.body.username
},(err, data) => {
if(err){
console.log(err);
console.log('not fund');
}else{
if(data === null){
res.json({code: 0});
}else{
if(data.password === req.body.password){
const token = createToken({
id: data._id,
name: data.username
});
console.log('登陆成功');
res.json({
code: 200,
data:{
token: token
}
});
}else{
res.json({code: 1});
}
}
}
})
});
- 登录前端:
$.ajax({
type: 'POST',
url: '/api/login',//这里前面的http://12.0.0.1:8082可以省略的
data: user,
success: function(data) {
switch(data.code){
case 200:
alert("登录成功");
sessionStorage.setItem("token",data.data.token);
sessionStorage.setItem("username",user.username);
window.location.href="/page/articles/home.html";
break;
case 0:
$("#prompt").text("用户不存在");
break;
case 1:
$("#prompt").text("密码错误");
break;
}
}
});