Запрос API от интерфейса с использованием sails.io.js

#websocket #socket.io #sails.js #sails.io.js

#websocket #socket.io #sails.js #sails.io.js

Вопрос:

У меня есть базовый интерфейс (html, css, jquery), и я хотел бы использовать sails.io.js для связи с сервером API (разработанным с помощью sails, с включенным cors). API работает на localhost: 10000, но позже он будет находиться в другом домене, отличном от домена веб-клиента.

Непосредственно из jquery я могу отправить некоторый запрос get к этому API и получить ожидаемые результаты.

Когда дело доходит до websocket, у меня возникают некоторые проблемы… В index.html (просто для проверки), я поставил следующее:

 <script src="js/sails.io.js"></script>
<script type="text/javascript">
    io.sails.url('http://localhost:10000');
    io.socket.get('/data', function serverResponded (body, sailsResponseObject) {
      // body === sailsResponseObject.body
      console.log('Sails responded with: ', body);
      console.log('with headers: ', sailsResponseObject.headers);
      console.log('and with status code: ', sailsResponseObject.statusCode);
    });
 </script>
  

Но инструменты разработчика Chrome говорят мне

 ReferenceError: io is not defined 
  

Есть идеи?

Обновить

Я обслуживаю index.html с веб-сервером (python -m SimpleHTTPServer)
Я установил sails.io.js использование беседки.

Я постарался сделать этот тест как можно более простым:

index.html

 <!DOCTYPE html>
<html lang="en">
  <head>
  </head>
  <body>
    <script src="bower_components/sails.io.js/dist/sails.io.js"></script>
    <script src="index.js"></script>
  </body>
</html>
  

index.js:

 window.onload=function(){
    io.sails.url = 'http://localhost:10000';
    io.socket.get('http://localhost:10000/data', function (body, response) {
      console.log('Sails responded with: ', body);
    });
};
  

Мой sails (0.9.16) API возвращает только объект json на маршруте GET / data.

Я реализовал фиктивную функцию __getcookie в api:

 'get /__getcookie': function(req, res, next){
    res.json({ok: 123});
}
  

И прокомментировал строку 481 в interpret.js (Скотт комментирует ниже).

Я также изменил конфигурацию / сокет.js с:

  authorization: false,
  

=> Теперь я могу получить результат из маршрута / data моего API 🙂

Но … при каждом запросе у меня возникает следующая ошибка:

 error: Error: No valid session available from this socket.
  

Ответ №1:

Прежде всего, sails.io.js включает в себя код для socket.io.js , так что нет необходимости пытаться включить это отдельно. Вы должны удалить эту строку:

 <script src="bower_components/socket.io/lib/socket.js"></script>
  

Далее, если вы просто загружаете index.html с диска (вместо того, чтобы обслуживать его с веб-сервера) вам нужно будет указать клиенту сокета Sails, к какому URL-адресу подключаться:

 io.sails.url = 'http://localhost:10000';
  

Поместите это куда угодно, прежде чем начинать выполнять вызовы сокетов; библиотека достаточно умна, чтобы подождать, пока она не подключится, прежде чем пытаться совершать вызовы. Итак, в целом:

 window.onload=function(){
    io.sails.url = 'http://localhost:10000';
    io.socket.get('http://localhost:10000/data', function (body, sailsResponseObject) {
        console.log('Sails responded with: ', body);
        console.log('with headers: ', sailsResponseObject.headers);
        console.log('and with status code: ', sailsResponseObject.statusCode);
    });
};
  

должно работать. Вы должны иметь возможность видеть в консоли, подключен сокет или нет, ища сообщение « io.socket подключено успешно».

Комментарии:

1. Я полностью выполнил то, что вы описали, но все еще есть некоторые ошибки (я обновил вопрос).

2. Вы не делаете то, что я описал. Вы вызываете url как функцию вместо установки переменной. С моей стороны, у меня была опечатка в моем ответе (это io.socket не io.sails так).

3. Извините, я виноват. На этот раз все именно так, как вы предложили 🙂 но в итоге я получаю следующее: GET /socket.io/1/?__sails_io_sdk_version=0.10.0amp;__sails_io_sdk_platform=browseramp;__sails_io_sdk_language =javascriptamp;t= 1403848955182 HTTP / 1.1″ 404 —

4. Просто вопрос … может ли эта ошибка быть связана с тем фактом, что я использую sails.io.js 0.10.1 (версия по умолчанию, установленная bower), на котором работает мой сервер sails API 0.9.16?

5. Черт возьми, это неловко, но я был прав в первый раз: это io.sails.url не io.socket.url так. В противном случае он должен работать, и sails.io.js from Bower должен быть обратно совместим с версией 0.9.16. Я не получаю 404, когда пытаюсь это сделать…

Ответ №2:

  1. вы пробовали использовать / перед src, например:

    < script src=»js/sails.io.js «>

  2. Есть ли у вас sails.io.js в папке /assets/js/ (sails 0.10) или в папке /assets/linker/js (sails 0.9 и ниже).

  3. Sails lift скопировал этот файл js в папку .tmp /public/js?

  4. Где ваш index.html файл найден?

Комментарии:

1. 1. Я пробовал с / без наилучших результатов. 2. Я использую только sails.io.js сам по себе. 4. index.html это просто тестовый файл сам по себе

2. Мой находится в asseets/js/dependencies (v0.11.0), но http://localhost:1337/js/dependencies/sails.io.js возвращает 404 время доступа из /signup view ( <script type="text/javascript" src="/js/dependencies/sails.io.js"></script> ). Что с этим?