02更新用户在线状态

1、场景

1、当用户主动退出登录

2、当用户关闭当前页面

3、当用户的session信息过期时

2、思路

1、前两个场景可以编写接口,前端在合适时机调用

router.post('/logout', async (req, res, next) => {
  await userModel.updateOne({ _id: req.session.userId }, { online: 0 })
  // 1:关闭窗口  2:退出登录
  if (req.body.type == 1) {
    res.json({ code: 0, msg: '操作成功' })
  } else if (req.body.type === 2) {
    req.session.destroy(() => {
      res.json({ code: 0, msg: '操作成功' })
    })
  }
})

2、第三个场景有多种思路

1、编写接口,检查用户的登录状态

router.post('/checkLogin', async (req, res, next) => {
  if (!req.session.userId) {
    res.json({ code: 401, msg: '用户未登录' })
    return
  }
  await userModel.updateOne({ _id: req.session.userId }, { online: 1 })
  res.json({ code: 0, msg: '处于登录状态' })
})

2、编写中间件。当用户请求时,检查登录状态

const sessionMiddleWare = async (req, res, next) => {
  if (!req.session.userId) {
    res.json({ code: 401, msg: '用户未登录' })
    return
  }
  next()
}

3、登录后,记录登录时间。定时遍历所有用户信息。当某个用户的登录时间+session有效时间等于当前时间的时候。更新用户登录状态

const userModel = require('../db/model/user')
const { SESSIONTIME } = require('../config/index')
let timer = null
const updateUsersOnlineStatus = async () => {
  try {
    const start = Date.now()
    const userData = await userModel.find({ online: 1, loginTime: { $lte: Date.now() - SESSIONTIME } })
    if (userData.length > 0) {
      const bulkOps = userData.map(user => ({
        updateOne: {
          filter: { _id: user._id },
          update: { online: 0 },
        },
      }))
      await userModel.bulkWrite(bulkOps)
    }
    const end = Date.now()
    const elapsed = end - start
    const nextInterval = Math.max(0, 1000 * 60 - elapsed) // Ensure next interval is at least 1 minute
    return nextInterval
  } catch (error) {
    console.error('Error updating user online status:', error)
    return 1000 * 60 // Retry after 1 minute on error
  }
}
const startOnlineStatusCheck = async () => {
  try {
    const interval = await updateUsersOnlineStatus()
    if (timer) {
      clearInterval(timer)
    }
    timer = setInterval(updateUsersOnlineStatus, interval)
  } catch (error) {
    console.error('Error starting online status check:', error)
  }
}

module.exports = startOnlineStatusCheck

相关推荐

  1. 02更新用户线状态

    2024-07-10 03:30:04       23 阅读
  2. 【Android 线程】线程中更新UI

    2024-07-10 03:30:04       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 03:30:04       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 03:30:04       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 03:30:04       90 阅读
  4. Python语言-面向对象

    2024-07-10 03:30:04       98 阅读

热门阅读

  1. CSS魔法:link与@import的秘密较量

    2024-07-10 03:30:04       23 阅读
  2. 第12章:软件系统分析与设计

    2024-07-10 03:30:04       22 阅读
  3. Rust入门实战 编写Minecraft启动器#2建立资源模型

    2024-07-10 03:30:04       26 阅读
  4. three.js利用着色器实现波浪效果

    2024-07-10 03:30:04       25 阅读
  5. Python pdfplumber库:轻松解析PDF文件

    2024-07-10 03:30:04       28 阅读
  6. 【必读】HTML中的BFC:10个你不知道的惊人事实

    2024-07-10 03:30:04       25 阅读