Node.js Can';Don’不要用我的握手来制作works socket.io
我不明白我的问题在哪里。 当我这样说的时候:Node.js Can';Don’不要用我的握手来制作works socket.io,node.js,sockets,handshake,Node.js,Sockets,Handshake,我不明白我的问题在哪里。 当我这样说的时候: io = require('socket.io').listen(server).of("/"); 我觉得我的握手看起来运行得很好,但我所有的socket.io事件(比如连接)都无法正常工作。 当我把这个 io = require('socket.io').listen(server); 我明白了: TypeError:对象#没有方法“授权” 如果我取消握手,所有socket.io都会工作,但我需要它:/ 这里是我的app.js const e
io = require('socket.io').listen(server).of("/");
我觉得我的握手看起来运行得很好,但我所有的socket.io事件(比如连接)都无法正常工作。
当我把这个
io = require('socket.io').listen(server);
我明白了:
TypeError:对象#没有方法“授权”
如果我取消握手,所有socket.io都会工作,但我需要它:/
这里是我的app.js
const express = require('express')
, app = express()
, http = require('http')
, ejs = require('ejs')
, server = http.createServer(app)
, port = process.env.PORT || 1337
, io = require('socket.io').listen(server).of("/")
;
module.exports = { app: app, server: server };
// Grab "cookie" and "connect" from express
var connect = require('express/node_modules/connect')
var cookie = require('express/node_modules/cookie')
var connectes =[];
app.configure(function(){
this.use("/public", express.static(__dirname + '/public'));
this.use(express.cookieParser());
this.use(express.json());
this.use(express.urlencoded());
this.sessionStore = new express.session.MemoryStore({ reapInterval: 60000 * 10 });
this.use(express.session({
"secret": "some private string",
"store": this.sessionStore
}));
});
app.engine('html', ejs.renderFile);
app.set('views', __dirname + '/views');
app.get('/', [requireLogin], function(request, response) {
var pseudo = request.session.pseudo;
response.render('index.ejs.html',{connectes:connectes});
});
app.get('/login', function(request, response) {
response.render('login.ejs.html');
});
app.post("/login", function(req, res){
if (req.param("user") != "") {
req.session.pseudo = req.param("user");
//socket.set('pseudo',req.param("user"));
connectes.push(req.param("user"));
res.render('index.ejs.html',{connectes:connectes});
}else{
res.render('login.ejs.html');
}
});
const parseCookie = require('connect').utils.parseCookie;
io.authorization(function (handshakeData, callback) {
var cookies = cookie.parse(handshakeData.headers.cookie);
console.log(cookie);
});
io.on('connection', function(socket){
console.log("This never appear in log :/");
socket.on('login',function(user,callback){
var pseudoValide = true;
for (var i = 0; i < connectes.length; i++) {
if(connectes[i]==user.pseudo){
pseudoValide = false;
callback(true);
}
}
if (pseudoValide) {
socket.set('pseudo',user.pseudo);
pseudo = user.pseudo;
socket.broadcast.emit('newuser', pseudo);
socket.broadcast.emit('nvluseronline', pseudo);
connectes.push(pseudo);
callback(false,pseudo);
}
});
socket.on('message',function(message){
messageUser = message.message;
socket.get('pseudo',function(error, pseudo){
io.sockets.emit('nouveauMessage',{pseudo:pseudo,message:messageUser});
})
});
socket.on('disconnect',function(){
socket.get('pseudo',function(error, pseudo){
connectes = unset(connectes, pseudo);
io.sockets.emit('nvldisc', pseudo);
})
});
});
function unset(array, value){
var output=[];
var index = array.indexOf(value)
{
var j = 0;
for(var i in array)
{
if (i!=index)
{
output[j]=array[i];
j++;
}
}
return output;
}
}
/** Middleware */
function requireLogin (req, res, next) {
if (req.session.pseudo) {
console.log(req.session.pseudo);
next();
}else{
res.redirect("/login");
}
}
if (!module.parent) {
server.listen(port, function () {
console.log('Listening', this.address());
})
}
const express=require('express'))
,app=express()
,http=require('http')
,ejs=require('ejs')
,server=http.createServer(应用程序)
,port=process.env.port | | 1337
,io=require('socket.io')。侦听(服务器)。of(“/”)
;
module.exports={app:app,server:server};
//从express中获取“cookie”和“connect”
var connect=require('express/node\u modules/connect')
var cookie=require('express/node\u模块/cookie')
var connectes=[];
app.configure(函数(){
this.use(“/public”,express.static(_dirname+”/public));
this.use(express.cookieParser());
this.use(express.json());
this.use(express.urlencoded());
this.sessionStore=new express.session.MemoryStore({reapInterval:60000*10});
这个。使用(express.session)({
“秘密”:“一些私人字符串”,
“存储”:this.sessionStore
}));
});
app.engine('html',ejs.renderFile);
app.set('views','u dirname+'/views');
app.get('/',[requireLogin],函数(请求,响应){
var pseudo=request.session.pseudo;
render('index.ejs.html',{connectes:connectes});
});
app.get('/login',函数(请求、响应){
response.render('login.ejs.html');
});
app.post(“/login”),函数(请求、回复){
如果(请求参数(“用户”)!=“”){
req.session.pseudo=req.param(“用户”);
//socket.set('pseudo',请求参数(“user”);
连接推送(请求参数(“用户”));
res.render('index.ejs.html',{connectes:connectes});
}否则{
res.render('login.ejs.html');
}
});
const parseCookie=require('connect')。utils.parseCookie;
io.授权(功能(握手数据、回调){
var cookies=cookie.parse(handshakeData.headers.cookie);
控制台日志(cookie);
});
io.on('连接',函数(套接字){
console.log(“这永远不会出现在日志中:/”;
socket.on('login',函数(用户,回调){
var pseudoValide=真;
对于(var i=0;i
就像你看到的,我是一个迷路的初学者
谢谢你们 您应该仔细阅读授权书<代码>授权方法仅适用于名称空间。执行全局授权时,您必须执行以下操作:
io.configure(function (){
io.set('authorization', function (handshakeData, callback) {
callback(null, true); // error first callback style
});
});
如果您将(“/”的
.of(“/”)作为服务器端点,那么它可以正常工作,但它是一个名称空间。如果没有名称空间,您将不得不使用上述方法。谢谢你,伙计,我知道我的错误在哪里,现在一切都很完美!:)