https://eggjs.org/zh-cn/basics/middleware.html
官方文檔說的很清楚了,再也不敘述。html
在controller/user 修改密碼,session
async changePassword(){ if (this.ctx.session.userId) { // 若是有這個session // 執行修改密碼 } else { // 不寫就沒有響應,會404 ctx.redirect('/login'); } }
而後修改資料app
async changeUserInfo(){ if (this.ctx.session.userId) { // 若是有這個session // 執行修改資料 } else { // 不寫就沒有響應,會404 ctx.redirect('/login'); } }
而後登陸就不用判斷async
async login(){ let {userName, password} = this.ctx.request,body; // 校驗密碼 let userFind = this.service.findOne({userName, password}); // 獲取user信息 if (userFind) { this.ctx.session.userId = userFind._id; // 返回成功 this.ctx.body = '登陸成功'; } else { this.ctx.body = '登陸失敗,帳號密碼錯誤'; } }
這樣若是代碼量小的話也能接受,可是若是未來接口愈來愈多,須要檢驗權限的地方也愈來愈多,修改就會很麻煩。this
在app/middleware下面新建authLogin.js文件用來判斷是否登陸url
module.exports = (options, app) => { return async function testMiddleware(ctx, next) { let whiteUrls = options.whiteUrls || []; // 若是ctx.url在白名單中 let isWhiteUrl = whiteUrls.some((whiteUrl)=> ctx.url.startsWith(whiteUrl)); if (! isWhiteUrl) { console.log('authLogin'); if (! ctx.session.userId) { ctx.redirect('/login'); // 讓用戶去登陸 } else { console.log('auth ok'); await next(); } } else { // 白名單 console.log('white url'); await next(); } }; };
在controller/user 修改密碼,code
async changePassword(){ //不須要判斷,直接執行修改密碼 }
而後修改資料router
async changeUserInfo(){ //不須要判斷,直接執行修改資料 }
而後登陸仍是同樣htm
async login(){ let {userName, password} = this.ctx.request,body; // 校驗密碼 let userFind = this.service.findOne({userName, password}); // 獲取user信息 if (userFind) { this.ctx.session.userId = userFind._id; // 返回成功 this.ctx.body = '登陸成功'; } else { this.ctx.body = '登陸失敗,帳號密碼錯誤'; } }
代碼是否是精簡清爽多了呢?中間件
config.middleware = [''authLogin'];
config.authLogin = { whiteUrls: ['/test'], // 是使用url的前綴匹配的 // 不須要登陸的頁面,白名單URL // 也能夠使用 ignore: ['/login', '/register', '/doLogin', '/doRegister'] // 使用 match是限制只在這幾個頁面執行 // match和ignore不能同時使用 };
router.get('/login', authLogin, controller.user.login);