1.在mongoose里面(原生也有),又两个api一般用来做分页;
query.skip:
query.limit:
model.countDocuments
dao.findstudents = async ({ page, limit }) => {
const count = await studentsModel.countDocuments();
const rows = await studentsModel.find().skip((page - 1)*limit).limit(limit);
return {
count,
data:rows
}
}
2.静态页面:自己梳理页面逻辑,下面是主要思想(代码自行考虑)
创建一个pager对象,用来管理页面状态
ajax发送的数据应该来自pager,ajax接收的数据应该整合到pager
1.我们用到的接口如下:
Get: /students/getStudents =>get : /students/
Post: /students/addStudents =>post: /students/:name
Post: /students/updateStudents =>put:/students/:id
Post: /students/deleteStudent =>put:/students/:id
2.代码部分通过上面,修改两个地方:
路由
router.delete(‘/:id‘,async function(req, res, next) {
const {id} = req.params;
const data = await service.deleteOne({id})
res.send(data);
});
静态页面
if ($(this).val() === "删除") {
$.ajax({
url: "students/"+id,
type: "delete",
success({ isDel }) {
?
if (isDel) {
?
render();
}
// console.log(data);
}
});
}
?
跨域的解决方案:jsonp,cors,代理服务器
代理服务器解决方案如下:
中间件自动代理
npm i http-proxy-middleware --save // 安装依赖
// server ====> ./app.js
const { createProxyMiddleware } = require(‘http-proxy-middleware‘);
const options = {
target: ‘[http://localhost:3000](http://localhost:3000/)‘, // 目标主机
changeOrigin: true, // needed for virtual hosted sites
pathRewrite: {
‘^/api‘: ‘/‘, // 重写路径
},
};
const exampleProxy = createProxyMiddleware(options);
app.use(‘/api‘, exampleProxy);
// client =====> [all].html
// 1. 如果某一个http请求需要被转发,请在原来的相对地址前面加一个"/api"
第三方手动代理,自主转发
npm i --save request request-promise
const rp = require("request-promise");
router.post(‘/login‘, async function (req, res, next) {
const data = await rp({
method: ‘POST‘,
uri: targetUrl + ‘/users/login‘,
body: req.body,
json: true
})
res.send(data);
});
1.session
2.jsonwebtoken (jwt)
实现步骤如下:
npm i jsonwebtoken express-jwt --save
a.登录成功生成并下发token(代理服务器)
//./routes/users.js
const jwt = require("jsonwebtoken")
const secretKey = "服务器需要保存的密钥"
if([成功]){
//生成token
const token = jwt.sign(
{username:"zs"},//payload
secretKey,//服务器密钥
{
expiresIn:60*60*2//过期时间
}
)
//下发token
res.send.({token,isLogin:true});
}else{
res.send({isLogin:false});
}
b.客户端接收到token并保存
//你的登录页面。xxx.html
function login(){
$ajax({
url:"xxx/login",
data:{username:"zs",password:"123"},
type:"post",
success({isLogin,token}){
if(isLogin){//success
localStorage.setItem("user_token",token);//保存token
//xxx
//xxx 做其他成功事情
//xxx
}else{//failed
//xxx
//xxx 做其他失败事情
//xxx
}
}
})
}
?
c.其他任何时期,需要携带token的ajax请求的实现。
// 你需要登录状态保持的页面(也就是需要权限的页面)xxx.html jquery:
$.ajaxSettings.beforeSend = function (xhr, request) {
const user_token = window.localStorage.getItem(‘user_token‘);
xhr.setRequestHeader(‘Authorization‘, `Bearer ${user_token}`);
}
d.对于请求进行校验:
//./app.js 校验中间件注册的位置一定要满足能够拦截需要权限的那些路径
const jwt = require("express-jwt");
const static = require("./uril/salt");
?
app.use(express.static(path.join(__dirname, ‘public‘)));
app.use(jwt({secret:secretKey,credentialsRequired: true}).unless({path:["/users/login","/users/reg"]}));//jwt中间件的注册
app.use(‘/api‘, exampleProxy(自动代理中间件));
3.密码加密:
const crypto = require(‘crypto‘);
const data = {
MD5_SUFFIX: ‘zxy_salt‘,
md5: (pwd) => {
let md5 = crypto.createHash(‘md5‘);
return md5.update(pwd+data.MD5_SUFFIX).digest(‘hex‘);
},
secretKey: ‘zxy_key‘
};
module.exports =data
?
//某个需要加密的模块 xxx.js
const {md5} = require("../util/salt")
?
const data = "需要加密的数据";
const newData = md5(data);//加密后的数据
原文:https://www.cnblogs.com/love599/p/13258919.html