如何从请求处理程序中分离代码(node.js&express.js)

我使用node.js和express.js写了一个简单的聊天应用程序,觉得我做错了什么。 聊天本身在第一页加载时工作正常,但是在每一页重新加载时,我将所有消息打印出来两次或更多次(取决于页面重新加载的次数)。 看起来像我得到每个页面上重新加载创build新的监听器。 据我所知,我需要从路由器处理程序中移出侦听器代码(io.socket),但我不明白在哪里移动,以后如何调用,以及页面请求中的渲染页面。 任何帮助赞赏。 谢谢。

这是我的应用程序代码:

./app.js

var express = require("express"); var app = express(); var test = require("./routes/test") var port = 3000; app.set("port", port); app.set("views", __dirname + "/views"); app.set("view engine", "jade"); app.get("/test", test.test); var io = require("socket.io").listen(app.listen(port)); app.set("io", io); console.log("Listening on port " + port); 

和./routes/test.js

 exports.test= function(req, res) { res.render('test'); var app = req.app; var io = app.get('io'); io.sockets.on('connection', function (socket) { socket.emit('message', { message: 'welcome to the chat' }); socket.on('send', function (data) { io.sockets.emit('message', data); }); }); } 

我在test.js中添加了socket.io('disconnect',function(){…}),并在“连接”和“断开”事件中添加了console.log(…)。 这证实在第n页刷新服务器得到了n个断开连接和n + 1个连接事件,这就是你说的你看到的。

刷新页面看起来像是断开连接到socket.io,它重新连接到丢失的连接,这会触发连接事件。 在同一时间你的socket.io('连接',…)触发另一个连接。

每刷新一次,您都会为传入的消息添加一个侦听器,并且每个都会获取socket.emit('message',…)消息。

我试了一些代码,如果你改变,你的代码应该运行

 io.sockets.on('connection', function (socket) { 

 io.sockets.once('connection', function (socket) { 

因为后者只是第一次运行事件处理程序。

我之前遇到过这个问题。

尝试将这些代码移出callbacktest.test

 io.sockets.on('connection', function (socket) { socket.emit('message', { message: 'welcome to the chat' }); socket.on('send', function (data) { io.sockets.emit('message', data); }); }); 

希望这会有所帮助