gpt4 book ai didi

node.js - 如何将代码与请求处理程序分离(node.js 和express.js)

转载 作者:太空宇宙 更新时间:2023-11-03 22:17:59 25 4
gpt4 key购买 nike

我正在使用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);
});
});
}

最佳答案

我在 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) {

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

关于node.js - 如何将代码与请求处理程序分离(node.js 和express.js),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17199365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com