Node.js 如何使函数只发生一次?
我得到了一个利用socket.io和express framework的简单聊天应用程序,下面是部分代码:Node.js 如何使函数只发生一次?,node.js,Node.js,我得到了一个利用socket.io和express framework的简单聊天应用程序,下面是部分代码: var app = express.createServer(); var socket = io.listen(app); var store = new express.session.MemoryStore; app.use(express.cookieParser()); app.use(express.session({ secret: 'something',
var app = express.createServer();
var socket = io.listen(app);
var store = new express.session.MemoryStore;
app.use(express.cookieParser());
app.use(express.session({
secret: 'something',
store: store,
cookie: {
maxAge: 60*60*24*30*1000
}
}));
app.get('/', function(req, res){
socket.on('connection', function(client) {
req.session.ioid = client.sessionId;
req.session.channel = req.param('channel');
req.session.username = req.param('username');
//I want the code below happen just once
res.header('Content-Type', 'text/plain');
res.header('Access-Control-Allow-Origin', '*');
res.send({sid:req.session.id});
});
});
在socket.on闭包中可以看到res.header和res.send。这些“res”将持续执行,并导致错误“发送后无法设置头”
我正在寻找一种方法,使块-
res.header('Content-Type', 'text/plain');
res.header('Access-Control-Allow-Origin', '*');
res.send({sid:req.session.id});
-只发生一次。尝试将响应头移出连接回调并移到“get/”回调中:
app.get('/', function(req, res){
socket.on('connection', function(client) {
req.session.ioid = client.sessionId;
req.session.channel = req.param('channel');
req.session.username = req.param('username');
});
res.header('Content-Type', 'text/plain');
res.header('Access-Control-Allow-Origin', '*');
res.send({sid:req.session.id});
});
但在你的例子中,排序似乎很奇怪。如果每次处理一个新请求时都向套接字添加一个连接回调,那么就会得到一堆(可能)冲突的会话属性。你可能需要重新思考
app.get('/', function(req, res){
socket.on("connection", function(client) {
req.session.ioid = client.sessionId;
req.session.channel = req.param('channel');
req.session.username = req.param('username');
});
socket.once('connection', function(client) {
//I want the code below happen just once
res.header('Content-Type', 'text/plain');
res.header('Access-Control-Allow-Origin', '*');
res.send({sid:req.session.id});
});
});
使用@maerics取悦你的学究我已经在get中包装了全部内容。你能澄清一下我对相关主题的理解吗,为什么在这段代码中你要在
get/
中包装那些套接字事件侦听器绑定?据我所知,socket.on只是添加了事件侦听器来侦听任何套接字连接,因此,所有这些代码段看起来都像“在有人尝试获取“/”之前不要侦听此套接字事件”,但之后它将继续侦听其他用户的事件,无论他们尝试获取什么,而且会产生更多的事件侦听器,因为有人会试图获取“/”,似乎我完全误解了某些内容…啊,似乎这不是我对socket eventlisteners垃圾邮件的误解,我在评论中提到了这一点,以获得更高的回复。。。