egg.js 中間件完成存儲ip

1. 配置中間件(有坑請注意)

1、在 app/middleware 下編寫中間件。
2、配置中間件

坑!!!:請注意一般情況下,我們會在 router.js 中,開啓中間件,這麼做一般情況下沒事兒,但是爲了存儲訪問者ip,我們需要在中間件中插入一條數據,此時我們就用到了module.exports = (optinos,app) =>{} 中的 app。加入我們在 router 中使用中間件會導致 app 不存在。故需要在config.default.js 中配置。

  config.middleware = [ '中間件名稱' ];
  config.中間件名稱= {
    enable: true,    // 是否開啓
    match: [ '/blog' ],	// 作用於的路由
  };

2. 實現

實現的功能:

  1. 存儲session,ip,訪問時間等數據。
  2. 已存在session則更新其數據
  3. 一天之內只算訪問一次的量
'use strict';
module.exports = (options, app) => {
  return async function blogauth(ctx, next) {
  	// 直接執行下一步 
    next();
    
	const new_ip = ctx.request.ip;						// 獲取ip
    if (new_ip === '120.27.20.14') return false; 		//  判斷是“自己”服務器ip就過濾掉
    const date = Date.parse(new Date()) / 1000;			// 獲取當期時間/1000(爲了字段是int(11))
    const session_blog = ctx.session.SESSION_BLOG; 		//  獲取客戶端時候有session(沒有則爲undefined)
    const visitor = await app.mysql.get('visit', { session: session_blog }); // 查詢詞session表中已經存在
    if (!session_blog || !visitor) {					// 沒有session 或者 表中不存在session用戶,則插入一條新的數據
      const visit_session = 'blog_' + date;				// 產生新的session
      ctx.session.SESSION_BLOG = visit_session;
      app.mysql.insert('visit', { session: visit_session, ip: new_ip, visit_time: date, visit_last_time: date });// 插入數據
    } else { // 存在session則更新此seeison用戶的數據
      let { ip, times, id, visit_last_time } = visitor;
      if ((visit_last_time - date) < (60 * 24)) return false;  // 一天之內 不在記錄訪問次數
      if (ip.indexOf(new_ip)) ip += (',' + new_ip);	// 同一session不用ip記錄
      app.mysql.update('visit', { id, ip, times: times += 1, visit_last_time: date }); // 更新數據
    }
  };
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章