简体   繁体   English

fns[i](socket, function(err){ TypeError: Property '0' of object [object Object] 不是 /socket.io/lib/namespace.js:119 中的函数

[英]fns[i](socket, function(err){ TypeError: Property '0' of object [object Object] is not a function in /socket.io/lib/namespace.js:119

I am new to socket.io and node.js I refered some online documents and created a socket server, it was working fine, but now it shows so many errors, Since I don't know socket.io and node.js I am unable to rectify the problem.我是 socket.io 和 node.js 的新手我参考了一些在线文档并创建了一个套接字服务器,它工作正常,但现在它显示了很多错误,因为我不知道 socket.io 和 node.js 我是无法纠正问题。

I am receiving the following error in my server side我在服务器端收到以下错误

/home/sitename/public_html/chat-server/node_modules/socket.io/lib/namespace.js:119 fns[i](socket, function(err){ ^ TypeError: Property '0' of object [object Object] is not a function at run (/home/sitename/public_html/chat-server/node_modules/socket.io/lib/namespace.js:119:11) at Namespace.run (/home/sitename/public_html/chat-server/node_modules/socket.io/lib/namespace.js:131:3) at Namespace.add (/home/sitename/public_html/chat-server/node_modules/socket.io/lib/namespace.js:160:8) at Client.connect (/home/sitename/public_html/chat-server/node_modules/socket.io/lib/client.js:76:20) at Server.onconnection (/home/sitename/public_html/chat-server/node_modules/socket.io/lib/index.js:367:10) at Server.EventEmitter.emit (events.js:95:17) at Server.handshake (/home/sitename/public_html/chat-server/node_modules/engine.io/lib/server.js:310:8) at Server.onWebSocket (/home/sitename/public_html/chat-server/node_modules/engine.io/lib/server.js:392:10) at /home/sitename/public_html/chat-server/node_m /home/sitename/public_html/chat-server/node_modules/socket.io/lib/namespace.js:119 fns[i](socket, function(err){ ^ TypeError: Property '0' of object [object Object] 是在 Namespace.run (/home/sitename/public_html/chat-server/node_modules) 上不是运行函数 (/home/sitename/public_html/chat-server/node_modules/socket.io/lib/namespace.js:119:11) /socket.io/lib/namespace.js:131:3) 在 Namespace.add (/home/sitename/public_html/chat-server/node_modules/socket.io/lib/namespace.js:160:8) 在客户端。在 Server.onconnection (/home/sitename/public_html/chat-server/node_modules/socket.io) 连接 (/home/sitename/public_html/chat-server/node_modules/socket.io/lib/client.js:76:20) /lib/index.js:367:10) 在 Server.EventEmitter.emit (events.js:95:17) 在 Server.handshake (/home/sitename/public_html/chat-server/node_modules/engine.io/lib/ server.js:310:8) 在 Server.onWebSocket (/home/sitename/public_html/chat-server/node_modules/engine.io/lib/server.js:392:10) 在 /home/sitename/public_html/chat-服务器/节点_m odules/engine.io/lib/server.js:335:12 at completeHybiUpgrade2 (/home/sitename/public_html/chat-server/node_modules/ws/lib/WebSocketServer.js:284:5) odules/engine.io/lib/server.js:335:12 at completeHybiUpgrade2 (/home/sitename/public_html/chat-server/node_modules/ws/lib/WebSocketServer.js:284:5)

and in the client side I am receiving the following error在客户端,我收到以下错误

GET https://sitename/socket.io/?EIO=3&transport=polling&t=1483766845342-50获取https://sitename/socket.io/?EIO=3&transport=polling&t=1483766845342-50

and

WebSocket connection to 'wss://sitename:3000/socket.io/?EIO=3&transport=websocket' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED WebSocket 连接到“wss://sitename:3000/socket.io/?EIO=3&transport=websocket”失败:连接建立错误:net::ERR_CONNECTION_REFUSED

client side code客户端代码

<script src="https://cdn.socket.io/socket.io-1.3.2.js"></script>

  var socket = io();

    var socket = io.connect( 'https://sitename:3000',{secure: true,
'sync disconnect on unload': true,'reconnect': true,
  'reconnection delay': 500, rejectUnauthorized: false ,   transports: [
    'websocket', 
    'flashsocket', 
    'htmlfile', 
    'xhr-polling', 
    'jsonp-polling', 
    'polling'
  ]} );

server side code服务器端代码

var fs = require('fs');
var app = require('express')();
var https = require('https');
var options = {
  key: fs.readFileSync('./privatekey.pem'),
  cert: fs.readFileSync('./certificate.crt')
};
var server = https.createServer(options, app);
//var io = require('socket.io')(server);
var io = require('socket.io').listen(server);
var socket = io.use({
  transports: [
    'websocket', 
    'flashsocket', 
    'htmlfile', 
    'xhr-polling', 
    'jsonp-polling', 
    'polling'
  ]
});



var clients=[];
var gamename={};
var socketid={};


app.use(function (req, res, next) {

    // Website you wish to allow to connect
    res.setHeader('Access-Control-Allow-Origin', 'https://sitename:3000');

    // Request methods you wish to allow
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

    // Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', true);

    // Pass to next layer of middleware
    next();
});


app.get('/', function(req, res){
  res.sendfile('index.html');
});

io.on('connection', function(socket){

});

server.listen(3000, function(){

  console.log('It is Listening on *:3000');
});

It looks to me like you probably have invalid transports specified which causes socket.io to make an error (I don't recognize transport names like htmlfile and polling ).在我看来,您可能指定了无效的传输,这会导致 socket.io 出错(我不认识传输名称,如htmlfilepolling )。

The way you know if this is the case or not is to remove all transports entirely from both client and server so you don't even specify that option.您知道是否是这种情况的方法是从客户端和服务器完全删除所有传输,因此您甚至不指定该选项。 Then you will have only the default, built-in transports (which should just be just websocket and xhr-polling).然后你将只有默认的内置传输(应该只是 websocket 和 xhr-polling)。

You must only specify transports that you have support for and that you actually need.您必须仅指定您支持且实际需要的传输。 You cannot just make up transport names.您不能只是编造传输名称。

let jwt = require('jsonwebtoken');

You should pass object "{ transports: [] }" into .listen func as below:您应该将对象 "{ transports: [] }" 传递到 .listen func 中,如下所示:

let io = require('socket.io').listen(server, {
    transports: ['websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling', 'polling']
});

into use() you can pass cb func as below:进入 use() 你可以传递 cb func 如下:

io.use(async (socket, next) => {
    const {
        handshake: {
            query
        }
    } = socket;
    if (query && .query.token){
        jwt.verify(query.token, 'SECRET_KEY', function(err, decoded){
          if(err) return next(new Error('Authentication error'));
          socket.decoded = decoded;
          next();
       });
    } else {
      next(new Error('Authentication error'));
    }    
})
 .on('connection', (socket) => {
    // emit ot listen socket
    socket.on('message', (message) => {
       console.log('=================== ', message);
 })
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM