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||"" }); }
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
事件更新点击时间。