Nodejs 利用socket.io监听访问量

Nodejs 利用socket.io监听访问量

这两天利用socket.io写了一个简易的网页流量监听(express+mongodb):

数据集 var Clicks = db.model(‘click’,new Schema({ intime:{type:Date,default:Date.now} //进入时间 ,referrer:String //上一步url = 入口 ,outtime:{type:Date,default:Date.now} //退出时间 ,address:String //ip地址 ,user:String //暂时用ip地址代替 })); status文件(设置mongoose连接mongodb):

var collection = “blog”; var mongoose = require(‘mongoose’); //mongoose.connect(‘mongodb://localhost/blog’); var db = mongoose.createConnection(‘mongodb://localhost/’+collection);

module.exports = { mongoose:mongoose ,db:db };

后台操作数据库采用的是mongoose操作mongodb

var status = require(’./…/status’); var mongoose = status.mongoose; var db = status.db; var Schema = mongoose.Schema; var Clicks…//数据集模型 var User = function(){}

User.prototype.intoclick=function(referrer,dd){ //用户链接成功后 //var ip = req.connection.remoteAddress; var d = Date(); var click = new Clicks ({intime:d,outtime:d,referrer:referrer,address:dd.ip,user:dd.ip}); click.save(function(err){ //var re = false; if(err){ console.log(err); return false; }else{

  Clicks.find({ intime: d}, function (err, docs) {
    if(err){
      console.log(err);
      return false;
    }else{
      dd._id =docs[0]._id;
    }
  });

}

}); }

User.prototype.outclick=function(dd){ //用户断开连接 var d = Date(); var click = new Clicks ({outtime:d}); console.log(dd._id); Clicks.update({_id:dd._id},{$set:{outtime:d}} ,function(err){ if(err){ console.log(err); }else{ console.log(dd._id); } }); }

socket.io监听: var User = require("./…/moudels/user.js"); module.exports = function(io,app){ //app为express的get post用 io.sockets.on(‘connection’, function (socket) { var dd = {ip:socket.handshake.address.address,_id:0}; socket.on(‘intoclick’, function (data) { User.intoclick(data.referrer,dd); }); socket.on(‘disconnect’, function (socket) { User.outclick(dd); }); }); }

前端: window.onload=function(){ var socket = io.connect(‘http://localhost’); socket.emit(‘intoclick’, { referrer:document.referrer||"" }); }


4 回复

Node.js 利用 Socket.io 监听访问量

在这篇文章中,我将介绍如何使用 Node.js、Express 和 MongoDB 结合 Socket.io 来实现一个简单的网页访问量统计系统。我们将通过 Socket.io 实时监听客户端的连接和断开事件,并在每次连接时记录访问信息。

数据模型

首先,我们需要定义数据模型来存储点击事件。这里我们使用 Mongoose 操作 MongoDB:

// models/click.js
const mongoose = require('mongoose');

const clickSchema = new mongoose.Schema({
  intime: { type: Date, default: Date.now }, // 进入时间
  outtime: { type: Date, default: null },   // 退出时间
  referrer: String,                         // 上一步 URL
  address: String,                          // IP 地址
  user: String                              // 用户标识(暂用 IP 地址)
});

const Click = mongoose.model('Click', clickSchema);

module.exports = Click;

状态管理

接下来,我们需要设置 Mongoose 连接 MongoDB:

// status.js
const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/blog', { useNewUrlParser: true, useUnifiedTopology: true });

const db = mongoose.connection;

module.exports = { mongoose, db };

后端逻辑

在后端,我们将处理用户的连接和断开事件,并更新数据库中的记录:

// models/user.js
const Click = require('./click');
const { mongoose } = require('../status');

class User {
  constructor() {}

  async intoclick(referrer, dd) {
    const click = new Click({
      intime: new Date(),
      outtime: null,
      referrer,
      address: dd.ip,
      user: dd.ip
    });

    try {
      await click.save();
      dd._id = click._id;
    } catch (err) {
      console.error(err);
    }
  }

  async outclick(dd) {
    try {
      await Click.updateOne(
        { _id: dd._id },
        { $set: { outtime: new Date() } }
      );
    } catch (err) {
      console.error(err);
    }
  }
}

module.exports = User;

Socket.io 配置

现在,我们可以配置 Socket.io 来监听客户端的连接和断开事件:

// server.js
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const User = require('./models/user');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

const user = new User();

io.on('connection', (socket) => {
  console.log('A user connected:', socket.id);

  socket.on('intoclick', (data) => {
    user.intoclick(data.referrer, { ip: socket.handshake.address.address, _id: 0 });
  });

  socket.on('disconnect', () => {
    user.outclick({ ip: socket.handshake.address.address, _id: 0 });
  });
});

server.listen(3000, () => {
  console.log('Server is running on port 3000');
});

前端代码

最后,在前端页面中,我们将初始化 Socket.io 并发送连接请求:

<script src="/socket.io/socket.io.js"></script>
<script>
  window.onload = function() {
    var socket = io.connect('http://localhost:3000');
    socket.emit('intoclick', { referrer: document.referrer || "" });
  };
</script>

以上就是使用 Node.js、Express、MongoDB 和 Socket.io 实现网页访问量统计的完整流程。希望对你有所帮助!


利用socket.io监听用户访问时间吗?

有了登入和登出 两个时间,访问时间就有了呀 intime,outtime

为了实现利用 socket.io 监听网页访问量的功能,我们可以参考以下代码。这里我们将使用 Node.js 和 socket.io 来实时收集页面访问量,并将这些信息保存到 MongoDB 中。

首先,确保安装了所需的依赖库:

npm install express socket.io mongoose

接下来是具体的代码实现:

数据模型定义

创建一个名为 models/click.js 的文件来定义点击记录的数据模型:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const ClickSchema = new Schema({
    intime: { type: Date, default: Date.now },
    outtime: { type: Date, default: null },
    referrer: String,
    address: String,
    user: String
});

module.exports = mongoose.model('Click', ClickSchema);

状态管理文件

创建一个 status.js 文件用于配置 MongoDB 连接:

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/blog', { useNewUrlParser: true, useUnifiedTopology: true });

module.exports = mongoose.connection;

后端逻辑

创建一个 server.js 文件来整合 Express、socket.io 和后端逻辑:

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const mongoose = require('./status');
const Click = require('./models/click');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

app.get('/', (req, res) => {
    res.sendFile(__dirname + '/index.html');
});

io.on('connection', (socket) => {
    const dd = { ip: socket.handshake.address.address, _id: 0 };

    socket.on('intoclick', async (data) => {
        try {
            const click = new Click({ intime: new Date(), outtime: null, referrer: data.referrer, address: dd.ip, user: dd.ip });
            await click.save();
            dd._id = click._id;
        } catch (err) {
            console.error(err);
        }
    });

    socket.on('disconnect', () => {
        Click.updateOne({ _id: dd._id }, { $set: { outtime: new Date() } })
             .then(() => console.log(`Disconnected user with ID ${dd._id}`))
             .catch(err => console.error(err));
    });
});

server.listen(3000, () => console.log('Server is running on port 3000'));

前端代码

创建一个 index.html 文件来处理前端逻辑:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Socket.IO Test</title>
</head>
<body>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        window.onload = function() {
            var socket = io.connect('http://localhost:3000');
            socket.emit('intoclick', { referrer: document.referrer || "" });
        };
    </script>
</body>
</html>

总结

这段代码实现了一个基本的页面访问量统计系统,它使用了 socket.io 来建立前后端通信,并通过 Mongoose 操作 MongoDB 来存储点击事件。当用户访问页面时,发送 intoclick 事件记录点击;当用户离开页面或关闭浏览器时,发送 disconnect 事件更新点击时间。

回到顶部