Как подключить файл file:// к серверу Node.js с помощью Socket.IO

Проблема в том, что протокол file:// не может отправлять XMLHttpRequests (я так думаю). Я использую Socket.IO и когда я пытаюсь это сделать var socket = io("my CodeSandbox server link");, он не подключается. Я не размещаю сервер на localhost, я размещаю его на CodeSandbox. Есть ли способ обойти протокол «file://», который не позволяет подключиться к серверу/отправить XMLHttpRequests?

Я поискал в Интернете, но там сказали, что это с ограничениями браузера. Я не могу использовать это, потому что мне нужно передать файл (на USB-накопителе) нескольким людям, и они не могут изменить флаги своего браузера.

Я в замешательстве. При чем здесь коды и ящик file://? И какое отношение file:// имеет к socket.io? Socket.io поверх file:// даже не имеет смысла, несмотря на ограничения.

tkausl 08.04.2024 18:16

сервер размещен на codeandbox. клиент размещен по адресу «file://». как файл:// может подключиться к серверу codeandbox для связи друг с другом?

Truder 08.04.2024 19:26

Почему вы не можете разместить файл на локальном сервере?

Konrad 09.04.2024 14:19

мне как бы нужно записать его на USB-накопитель, и я не знаю, как это сделать. возможно я смогу поискать это, спасибо.

Truder 09.04.2024 14:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
120
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, протокол file:// по сути такой же протокол, как и любой другой. У него есть некоторые дополнительные ограничения, одно из которых: document.domain=null — это специальный домен, который всегда не проходит никакую проверку домена.

Часто именно с этого начинают работать новые разработчики, еще не имея никакого представления о серверах, сетевых адаптерах , IP-адресах и доменных именах. Они просто создают базовые HTML-файлы на жестком диске, а затем либо дважды щелкают по ним, либо открывают браузер и нажимают Ctrl + O.

В начале я должен отметить потенциальные последствия для безопасности запуска ненадежного кода из протокола file://, поскольку следующее вполне вероятно, хотя из-за ограничений document.domain JavaScript не имеет доступа к данным:

    <!-- untrusted.html -->
    <body>
          <img src='../../../probably-dont-want-this-image-displayed-thanks.png' onload='fetch("http://bad.com/yep-this-exists")'>
          <iframe src='../../../super-secret.html'></iframe>
          <script src='../../../this-should-never-have-been-run-here.js'></script>
          <!-- etc -->
    </body>

При этом вы можете использовать протокол file://, как и любой другой.

Вы можете подключиться к своей виртуальной машине CodeSandbox (контейнер разработки, блок разработки),
но вам понадобится внешний URL-адрес. Внешний URL-адрес можно определить следующим образом:

    var port          = 3000;
    var hostname      = require('os').hostname;
    var previewUrl    = `https://${hostname}-${port}.csb.app`;
    console.info(previewUrl);    //  https://jmycxx-3000.csb.app

Я привел пример здесь.

Вы можете совершать любые вызовы, включая Socket.io. Вам понадобится ответ cors из-за того, как document.domain ведет себя в протоколе file://. В пример я включил ответ cors:

    //server.js

    var port          = 3000;
    var hostname      = require('os').hostname;
    var previewUrl    = `https://${hostname}-${port}.csb.app`;
    console.info(previewUrl);    //  https://jmycxx-3000.csb.app

    require('http').createServer(request).listen(port);

    function request(req,res){

          console.info(req.url,req.method);

          var headers   = {
                'access-control-allow-origin': '*',
          };

          if (req.method==='OPTIONS'){    //  cors
                res.writeHead(204,headers);
                res.end();
                return;
          }

          if (req.url==='/test'){
                res.writeHead(200,headers);
                res.end('testing 1 2 3');
                return;
          }

          res.end('helloworld');

    }//request

https://codesandbox.io/p/devbox/chat-test-jmycxx?file=/server.js

В прошлом у меня были проблемы с подобными сервисами (StackBlitz ) при использовании серверов HTTPS, вероятно, из-за способа перенаправления порта на виртуальную машину. Это больше похоже на ошибку, но имейте это в виду.

Вы можете отправлять к нему запросы на выборку (XMLHttpRequest) из файла:// или где-либо еще, например:

<!-- local-file.html -->
<script type=module>

      var res   = await fetch('https://jmycxx-3000.csb.app/test');
      var txt   = await res.text();
      //alert(txt);
      console.info(txt);    //  testing 1 2 3

</script>

Ваша виртуальная машина должна быть доступна, чтобы иметь возможность подключиться к ней, поэтому убедитесь, что вы запустили свой сервер в терминале и оставьте его включенным. Если вы закроете окно терминала, процесс завершится. Я не до конца разбираюсь в CodeSandbox, но в документации указано, что время прогрева/запуска у него измеряется секундами. Я буду следить за кодом и при необходимости обновлять этот ответ.

В остальном CodeSandbox кажется сервисом нового поколения, и я с нетерпением жду возможности изучить его и поработать с ним.

Другие вопросы по теме