如何将代码与请求处理程序分开(node.js& express.js)

时间:2013-06-19 19:10:12

标签: node.js routing express

我正在使用node.js和express.js编写一个简单的聊天应用程序,感觉我做错了。聊天本身在第一页加载时工作正常,但在每次重新加载页面时,我会将所有消息打印出两次或更多次(取决于页面重新加载的次数)。看起来我在每个页面重新加载时都会创建新的侦听器。根据我的理解,我需要从路由器处理程序中移出侦听器代码(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);
    });
});
}

2 个答案:

答案 0 :(得分:1)

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

您的页面刷新看起来像是与socket.io断开连接,它重新连接到丢失的连接,从而触发连接事件。同时你的socket.io('connection',...)触发了另一个连接。

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

我尝试了一些代码,如果你改变了

,你的代码应该运行
io.sockets.on('connection', function (socket) {

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

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

答案 1 :(得分:0)

之前我遇到过这个问题。

尝试将这些代码移到回调 test.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);
    });
});

希望这会有所帮助