在全局范围内访问嵌套变量的 Nodejs
Nodejs accessing nested variable in global scope
如何
根据我的以下 NodeJS 代码访问全局范围内的套接字
io.on('connection', function (socket) {
console.log('connection '+socket)
socket.on("data",function(d){console.log('data from flash: ',d);});
socket.emit("message","wtfwtwftwftwf hello from server");
socket.on('disconnect', function (socket) {
console.log("disconnect");
});
});
我需要从以下 app.post 方法中访问套接字
var express = require('express'),
multer = require('multer');
var app = express();
//auto save file to uploads folder
app.use(multer({ dest: './uploads/'}))
app.post('/', function (req, res) {
console.log(req.body); //contains the variables
console.log(req.files); //contains the file references
res.send('Thank you for uploading!');
});
应用收听(8080);
尚未测试,但要先尝试一个简单的 getter 函数
io.on('connection', function (socket) {
console.log('connection '+socket)
socket.on("data",function(d){console.log('data from flash: ',d);});
socket.emit("message","wtfwtwftwftwf hello from server");
return{
getSocket: function(){
return socket;
}
};
socket.on('disconnect', function (socket) {
console.log("disconnect");
});
});
io.getSocket() ??
Express的app
和 Socket.io 彼此无关。
所以从根本上说,你不能在app.post
里面使用socket
。
您需要识别客户端。您可以使用Passport,它有一个 Socket.io 插件,基本上将app.post
/get
的req.user
桥接到socket.request.user
。
注意:它不必是具有从数据库中获取的用户的经过身份验证的客户端,只需在内存中存储临时用户的客户端即可。 像这样:
app.use(function(req, res, next) {
if (!req.user) { // if a user doesn't exist, create one
var id = crypto.randomBytes(10).toString('hex');
var user = { id: id };
req.logIn(user);
res.redirect(req.lastpage || '/');
return;
}
next();
});
var Users = {};
passport.serialize(function(user) {
Users[user.id] = user;
done(null, user);
});
passport.deserialize(function(id) {
var user = Users[id];
done(null, user);
});
然后,您可以将客户端的套接字 ID 附加到其用户会话。
io.on('connection', function (socket) {
socket.request.user.socketid = socket.id
});
然后而不是socket.emit
使用 io.emit
在app.post
使用socketid
app.post('/', function (req, res) {
io.to(req.user.socketid).emit('whatever');
});
注意:io.to()
用于向房间发出,但默认情况下,每个套接字都加入到名为其socket.id
的同一房间,因此它可以工作。
Javascript 和 socketIO 专家>请告诉我为什么这个简单的解决方案不起作用。好像...
1 定义全局指针
var _this=this;
2 在我的套接字IO处理程序中引用套接字对象
_this.socket=socket;
3 最后在 app.post 内,像这样访问插座
_this.socket.emit(....
相关文章:
- 为变量分配多个nodejs导出返回值时出现问题
- 使用JS/NodeJS测试并读取文件中的变量
- 使用nodejs从url中获取变量
- 将 NodeJS 模块范围变量作为对象访问
- 从导出的模块返回变量,并在另一个文件(NodeJS)中使用它
- nodejs-settimeout是否在不同的循环中共享变量
- 使用NodeJS与客户端共享变量
- 如何将javascript变量导出到nodejs
- 如何在nodejs中的MySQL查询中使用多个变量
- NodeJS和ES6类实例中的变量可见性
- 将变量传递给nodejs函数
- nodejs中的Javascript全局变量和属性-全局属性有时会被删除
- 如何将变量传递到NodeJS模块中
- 在全局范围内访问嵌套变量的 Nodejs
- JScript 中的 NodeJS + JQuery php 变量
- nodejs 中的全局变量
- NodeJS,使用 Eclipse Debugger 进行变量检查
- 在 Nodejs 中设置 Prototype 类的成员变量
- 删除全局变量 nodejs
- 将数组中的段落拆分为单独的变量?NodeJS