我的JavaScript在将我的socket.io从http转换为https后给我一个奇怪的结果。
我的JavaScript在将我的socket.io从http转换为https后给我一个奇怪的结果。
我在我的node.js项目中有两个监听两个不同端口的socket.io服务器。\n我以http服务器的形式运行它们。\n我的服务器文件:\nvar server = require(\'http\').createServer(app);\n//服务器端口是5000\nvar io = require(\'socket.io\').listen(server);\nvar io3 = require(\'socket.io\').listen(5132);\n在我的第一个客户端页面/usrlist上:\nvar socket = io.connect(\'http://localhost:5000\',{\n reconnection: true,\n reconnectionDelay: 5000,\n reconnectionAttempts: 12\n});\n在我的客户端页面/playingroom上:\nvar socket = io.connect(\'http://localhost:5132\');\n然后我决定使用https来保证我的连接安全,所以我将代码更改为:\n我的服务器文件:\nconst cors = require(\'cors\');\napp.use(cors({credentials: true, origin: true}));\nvar httpsOptions = {\n key: fs.readFileSync(\'./app/certsandkeys/nwcertandkey/my-prvkey.pem\'),\n cert: fs.readFileSync(\'./app/certsandkeys/nwcertandkey/my-pubcert.pem\')\n}; \nvar sctio = require(\'https\').createServer(httpsOptions, app);\nsctio.listen(443);\nvar sctio3 = require(\'https\').createServer(httpsOptions, app);\nsctio3.listen(5132);\n//使用默认端口443而不是端口5000\nvar io = require(\'socket.io\').listen(sctio); \nvar io3 = require(\'socket.io\').listen(sctio3);\n在我的第一个客户端页面/usrlist上:\nvar socket = io.connect(\'https://localhost\',{\n secure: true,\n reconnection: true,\n reconnectionDelay: 5000,\n reconnectionAttempts: 12\n});\n在我的客户端页面/playingroom上:\nvar socket = io.connect(\'https://localhost:5132\',{secure: true});\n然后在运行我的代码后,我的JavaScript代码开始给我一个未定义的变量错误,但是在从http转换为https之前,我的JavaScript代码一直很好运行,我测试了很多次,我确定所有的包含文件URL都从http修改为https,我的页面可以很好地读取它们,但我不知道为什么除了我的socket.io代码之外,我的一个变量只是给我一个未定义的错误。\n更新:\n今天再次运行我的代码后,代码正常工作了一次,然后错误又回来了,然后错误以随机的方式出现和消失???\n错误消息:\n> jQuery.Deferred exception: $usercolor is not defined\n> MakeMove@https://localhost/cssFiles/js/makemove.js:170:4\n> CheckResult@https://localhost/cssFiles/js/guiMultiPlayer.js:62:9\n> CheckAndSet@https://localhost/cssFiles/js/guiMultiPlayer.js:183:6\n> NewGame@https://localhost/cssFiles/js/guiMultiPlayer.js:764:3\n> @https://localhost/cssFiles/js/main.js:9:2\n> e@https://localhost/js/jquery.min.js:2:29453\n> l/ jquery.min.js:2:31008\n我的服务器端的代码部分:\napp.post(\'/getcolor\', function (req, res, next) {\n var lCol=\"\";\n if(req.body.MoveString !== null){\n Move.setMoveUserId(req.user.id);\n a.getColor(req.user.id,function(col){\n res.json({\"msg\": col, \"loggedin\": \"true\"}); // <=== 这里有一个定义的lCol\n });\n } else {\n var output = {\"msg\": lCol, \"loggedin\": \"true\"}; // <=== 这里的lCol始终为空字符串\n res.json(output);\n }\n});\nJavaScript的post代码:\nfunction UserColor() { //用于检查对手的颜色\n var MoveString = BoardToFen();\n $.ajax({\n type:\'POST\',\n url:\'/getcolor\',\n data:{MoveString:MoveString},\n dataType:\'json\',\n cache: false,\n success:function(data){\n if (data.msg == \"white\"){\n $usercolor=0;\n console.log(\"usercolorusercolor\",$usercolor);\n } else{\n console.log(\"thrusercolorusercolor\",$usercolor);\n $usercolor=1;\n }\n }\n });\n return $usercolor;\n}\n我希望回答问题的人能解释一下为什么在从http的socket.io转换为https的安全连接之前,我的代码运行正常,但在转换之后,我开始遇到这个错误?
问题的原因是,在从http切换到https后,ajax调用中的成功回调函数不再被触发。解决方法是修改UserColor函数,在ajax调用中添加一个错误回调函数来记录网络错误。具体代码如下:
function UserColor(callback) { var MoveString = BoardToFen(); $.ajax({ type:'POST', url:'/getcolor', data:{MoveString:MoveString}, dataType:'json', cache: false, success:function(data){ if (data.msg == "white"){ $usercolor=0; } else{ $usercolor=1; } console.log("usercolorusercolor",$usercolor); callback(null,$usercolor); }, error:function(err) { console.error(err); callback(err); } }); }
参考链接:[Ajax success event not working](https://stackoverflow.com/questions/1969476)