我的JavaScript在将我的socket.io从http转换为https后给我一个奇怪的结果。

14 浏览
0 Comments

我的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的安全连接之前,我的代码运行正常,但在转换之后,我开始遇到这个错误?

0
0 Comments

问题的原因是,在从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)

0
0 Comments

根据错误信息显示的文本来看,问题并不在于socket.io。错误在于你在没有使用var/let/const语句的情况下定义了变量$usercolor。默认情况下,JavaScript代码在"严格模式"下执行,因此你需要使用var/let/const语句来声明变量。

解决方法是在定义变量$usercolor时使用var/let/const语句,例如:

var $usercolor = "red";

0