如何修复'Sails.js io.socket.post错误:尚未在核心中实现'

时间:2019-07-19 01:34:08

标签: node.js socket.io sails.js sails.io.js

我正在将Sails.js与Vue.js一起使用标准的Sails.js Web应用程序构建。 我使用的版本是:

  • Sails.js:1.2.2
  • Node.js:8.16.0
  • NPM:6.10.0

我正在尝试构建具有多个不同游戏室的应用程序,每个游戏室还具有聊天功能。所有房间都有唯一的URL。

我尝试了所有可以在Sails.js手册中找到的内容,也可以在socket.io中找到。问题似乎仅在使用io.socket.post函数时存在。

我的路由如下:

// The dir = Game file = playing and we need the gameId, partyId and PartyString.
'GET /game/playing/:gameId/:partyId/:partyString':
{ action: 'game/view-playing', locals: { layout: 'layouts/layout-play' } },
'POST /game/playing/:gameId/:partyId/:partyString':
{ action: 'game/view-playing', locals: { layout: 'layouts/layout-play' } },

// The dir = Game file = playing and we need the gameId, partyId, PartyString and the action ( The action receives: on-connect, chat, etc)
'GET /game/playing/:gameId/:partyId/:partyString/:action':
{ action: 'game/view-playing', locals: { layout: 'layouts/layout-play' } },
'POST /game/playing/:gameId/:partyId/:partyString/:action':
{ action: 'game/view-playing', locals: { layout: 'layouts/layout-play' } },

我的view-playing.js控制器如下所示:

fn: async function (inputs) {
switch (inputs.action) {
 case 'on-connect':
  console.log("action: on-connect");
  var partyInfo = await Party.findOne({ id: 1, game: 1 });

  sails.sockets.join(this.req, partyInfo.partyChatroomName);

  var chatData = partyInfo.chat;
  if(chatData.usernames.indexOf(this.req.me.username) === -1) {
   chatData.usernames.push(this.req.me.username);
  }
  await Party.update({ id: partyInfo.id  }).set({ chat: chatData });

  return this.res.ok({ user: this.req.me, userList: chatData.usernames });
  break;

仍然认为这不是出错的部分。 因为当我转到layout.ejs(实际上是layout-play.ejs)中的代码时,我猜错了代码。

$(document).ready(function(){

        var url = window.location.href.replace(window.location.protocol + "//" + window.location.hostname, '');

        io.socket.on('connect', function(){
          console.log("connected");
          io.socket.post(url+'/on-connect', { _csrf: window.SAILS_LOCALS._csrf } ,function(data, data2){
            console.log("Data2: " + data2.statusCode);
            for (var i = 0; i < data.userList.length; i++) {
              content = "<li>" + data.userList[i] + "</li>";
              $(".chat-page .user-list").append(content);
            }
          });



          io.socket.post(url+'/load-save', { _csrf: window.SAILS_LOCALS._csrf } ,function(data, data2){
            // console.log("Data2: " + data2.body);
            // console.log("Data2: " + data2.headers);
            // console.log("Data2: " + data2.statusCode);
            // console.log("Data2: " + data2.error);
          });

          io.socket.on('disconnect', function(){
            io.socket.post(url+'/disconnect', { _csrf: window.SAILS_LOCALS._csrf }, function(data, data2){
              console.log("Socket disconnected" + data);
            });
          });
        });

如您所见,io.socket.on('connect')可以正常工作,但并非总是如此,但在大多数情况下,通过Connected返回响应即可。 之后,您会看到3 io.socket.post请求,其中的CLI响应均给出500错误:

action: load-save
error: Sending 500 ("Server Error") response:
 { Error: Not implemented in core yet
    at MockServerResponse._renderShim [as render] (/home/nodejs/VaultDungeon/node_modules/sails/lib/router/res.js:333:40)
    at MockServerResponse.res.view (/home/nodejs/VaultDungeon/node_modules/sails/lib/hooks/views/res.view.js:336:16)
    at /home/nodejs/VaultDungeon/node_modules/machine-as-action/lib/machine-as-action.js:1009:30
    at afterwards (/home/nodejs/VaultDungeon/node_modules/machine-as-action/lib/machine-as-action.js:1024:17)
    at _waitForSimulatedLatencyIfRelevant (/home/nodejs/VaultDungeon/node_modules/machine-as-action/lib/machine-as-action.js:620:50)
    at Object.respondApropos [as success] (/home/nodejs/VaultDungeon/node_modules/machine-as-action/lib/machine-as-action.js:622:11)
    at /home/nodejs/VaultDungeon/node_modules/machine/lib/private/help-build-machine.js:1517:30
    at proceedToFinalAfterExecLC (/home/nodejs/VaultDungeon/node_modules/parley/lib/private/Deferred.js:1157:14)
    at proceedToInterceptsAndChecks (/home/nodejs/VaultDungeon/node_modules/parley/lib/private/Deferred.js:913:12)
    at proceedToAfterExecSpinlocks (/home/nodejs/VaultDungeon/node_modules/parley/lib/private/Deferred.js:845:10)
    at /home/nodejs/VaultDungeon/node_modules/parley/lib/private/Deferred.js:303:7
    at /home/nodejs/VaultDungeon/node_modules/machine/lib/private/help-build-machine.js:953:53
    at Function.handlerCbs.success (/home/nodejs/VaultDungeon/node_modules/machine/lib/private/help-build-machine.js:814:26)
    at /home/nodejs/VaultDungeon/node_modules/machine/lib/private/help-build-machine.js:1044:42
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7) statusCode: 501 }
<- POST /game/playing/1/4/4abb2c1a67cde7f81a0adf3117519498/load-save  (11ms 500)
 |  view: pages/game/playing

但是当我从io.socket.post中删除_csrf时,我收到以下消息:错误:服务器以403状态码响应:禁止。

有人看到错误或对此有其他看法可以帮助我吗? 感谢所有帮助

0 个答案:

没有答案