首先,我们需要创建一个项目,在里面创建一个package.json文件,里面包含了包的属性,之后我们可以通过命令来一次性安装package.json中所包含的包
①创建package.json文件
{
"dependencies": {
"body-parser": "^1.18.3",
"cookie-parser": "^1.4.4",
"express": "^4.16.4",
"jsonwebtoken": "^8.5.0",
"multer": "^1.4.1",
"mysql": "^2.16.0"
}
}
执行命令
cnpm install
①建议选择单独安装各个插件(建议采用这中方式,避免出错)
cnpm install mysql -S //安装mysql模块
cnpm install express -S //安装express框架模块
cnpm install body-parser -S //node.js中间件
cnpm install cookie-parser -S //解析Cookie的工具
cnpm install multer -S //node.js中间件
cnpm install jsonwebtoken -S //Token插件
这里使用-S后缀可以在package.json文件中生成模块的名称
注:单独安装插件是不用创建package.json文件,会自动生成
body-parser : node.js中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据
cookie-parser :解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象
multer :node.js中间件,用于处理 enctype=“multipart/form-data”(设置表单的MIME编码)的表单数据
②之后创建文件getDBcon.js(操作数据库模块)
getDBcon.js文件
//此模块作用为获取数据库的链接
var mysql = require('mysql'); //导入mysql模块
var defaultDBObj={
host: '127.0.0.1', //数据库地址
user: 'root', //数据库用户名
password: '123456', //数据库密码
database: 'database' //数据库名
}
function getDBcon(DBobj=defaultDBObj ){
var connection = mysql.createConnection(DBobj);
connection.connect(); //启动链接
return connection;
}
module.exports=getDBcon; //将模版导出,方便我们在别的文件中引用
③创建server.js文件(服务器模块)
var express = require("express"); //导入我们刚刚安装的express模块
var getDBcon = require("./getDBcon.js"); //导入上面的数据库模版文件
var bodyParser = require('body-parser'); //导入我们刚刚安装的body-parser模块
var app = express(); //使用express
app.listen(8081, function () {
console.log("服务器构建完成,访问地址为 http://127.0.0.1:8081");
});
//设置跨域访问(设置在所有的请求前面即可)
app.all("*", function (req, res, next) {
//设置允许跨域的域名,*代表允许任意域名跨域
res.header("Access-Control-Allow-Origin", "*");
//允许的header类型
res.header("Access-Control-Allow-Headers", "content-type");
//跨域允许的请求方式
res.header("Access-Control-Allow-Methods", "DELETE,PUT,POST,GET,OPTIONS");
if (req.method == 'OPTIONS')
res.send(200); //让options尝试请求快速结束
else
next();
});
//在后端可以使用body-Parser模块来接收发到后端的数据
//然后在请求中使用 req.body获取请求参数
app.use(bodyParser.urlencoded({entend:false}));
app.use(bodyParser.json());
③创建jwt.js文件(Token验证模块)
var jwt = require("jsonwebtoken"); //引用jws模块
//用es6的语法对生成Token和验证Token方法进行函数的封装
class tokenObj {
createToken(cont, time) {
var payload = { msg: cont } // Token 数据
var secret = 'gys.com' // 这是加密的key(密钥或私钥)
var token = jwt.sign(payload, secret, {
expiresIn: time // 24小时过期,以秒作为单位
})
return token;
}
checkToken(token, fn) {
var secret = 'gys.com' // 这是加密的key(密钥或私钥)
jwt.verify(token, secret, function (err, decode) {
if (err) { // 当token过期,或这是一个伪造的token,或这是无效的token时会触发此逻辑
console.log(err)
fn(false);
} else {
console.log(decode.msg);
fn(true);
}
})
}
}
这里放上一个请求的示例
js页面
(function ($) {
$(function () {
$("#login").on("click", function () {
$.ajax({
type: "post",
url: "http://127.0.0.1:8081/login",
data: $("form").serializeArray(), //序列化对象数组
success: function (response) {
console.log(response);
if (response == "null") { //登陆失败
alert("用户名或密码错误,请重新输入");
return;
} else {
//登陆成功
var token = JSON.parse(response).token; //将后端传过来的数据转为对象
sessionStorage.setItem('token', token); //存储到页面的临时会话中
if ($("input[type='checkbox']").is(':checked')) { //用户勾选了7天免登录
var myobj = { loginState: "yes" }; //将用户的信息写入对象数组myobj
cookieObj.setCookies(myobj); //调用下面简单封装的函数存储cookie信息
alert("登陆成功");
location.assign("./operation.html"); //页面跳转
} else { //用户没有勾选7天免登录
location.assign("./operation.html");
}
}
}
});
})
//对Cookie的简单封装调用
var myobj = {}; //对象数组,用来存储后台返回的信息
//将对象数组中的信息保存在cookie中
function setCookies(objArr) {
var d = new Date();
d.setTime(d.getTime() + 60 * 60 * 24 * 7);
d = d.toUTCString();
document.cookie = "loginState=" + objArr.loginState + ";expires=" + d + ";path=/";
}
//获取所有的cookie,以对象的形式返回
function getAllcookies() {
var obj = {};
var arr = document.cookie.split(";");
arr.forEach(function (ele) {
var arr2 = ele.split("=");
obj[arr2[0].trim()] = arr2[1];
});
return obj;
}
//将这几个函数作为一个对象的属性
var cookieObj = {
setCookies: setCookies,
getAllcookies: getAllcookies,
}
var state = cookieObj.getAllcookies().loginState;
if (state == "yes") {
setTimeout(function () {
$.ajax({
type: "post",
url: "http://127.0.0.1:8081/noLogin",
success: function (response) {
var token = JSON.parse(response).token; //将后端传过来的数据转为对象
sessionStorage.setItem('token', token); //存储到页面的临时会话中
}
});
location.assign("./operation.html?");
}, 2000)
}
console.log(state);
})
})(jQuery)
服务端的响应
var express = require("express"); //导入我们刚刚安装的express模块
var getDBcon = require("./getDBcon.js"); //导入上面的数据库模版文件
var bodyParser = require('body-parser'); //导入我们刚刚安装的body-parser模块
var app = express(); //使用express
var tokenObj = require('./jwt.js');
app.listen(8081, function () {
console.log("服务器构建完成,访问地址为 http://127.0.0.1:8081");
});
//设置跨域访问(设置在所有的请求前面即可)
app.all("*", function (req, res, next) {
//设置允许跨域的域名,*代表允许任意域名跨域
res.header("Access-Control-Allow-Origin", "*");
//允许的header类型
res.header("Access-Control-Allow-Headers", "content-type");
//跨域允许的请求方式
res.header("Access-Control-Allow-Methods", "DELETE,PUT,POST,GET,OPTIONS");
if (req.method == 'OPTIONS')
res.send(200); //让options尝试请求快速结束
else
next();
});
//在后端可以使用body-Parser模块来接收发到后端的数据
//然后在请求中使用 req.body获取请求参数
app.use(bodyParser.urlencoded({ entend: false }));
app.use(bodyParser.json());
app.get("/get", function (req, res) {
res.send("Hello World");
});
app.post("/login", function (req, res) {
var obj = req.body; //获取登陆传过来的数据
var connection = getDBcon(); //数据库对象
var sql = `select * from users where username=? and password=?;`;
//像数据库查询
connection.query(sql, [obj.username, obj.password], function (err, result) {
var resObj = {};
//登陆成功
if (result[0] != undefined) {
var myToken = new tokenObj();
var tokenv = myToken.createToken('login', 60 * 15);
resObj.msg = '登陆成功';
resObj.token = tokenv;
res.send(JSON.stringify(resObj));
} else {
res.send("null");
}
connection.end(); //关闭数据库链接
});
});
app.post("/noLogin", function (req, res) { //勾选了7天免登录,当登陆的时候将重新给用户一个token
var resObj = {};
var myToken = new tokenObj();
var tokenv = myToken.createToken('noLogin', 60 * 15);
resObj.token = tokenv;
res.send(JSON.stringify(resObj));
});