Проблема в том, что протокол file:// не может отправлять XMLHttpRequests (я так думаю). Я использую Socket.IO и когда я пытаюсь это сделать var socket = io("my CodeSandbox server link");
, он не подключается. Я не размещаю сервер на localhost, я размещаю его на CodeSandbox. Есть ли способ обойти протокол «file://», который не позволяет подключиться к серверу/отправить XMLHttpRequests?
Я поискал в Интернете, но там сказали, что это с ограничениями браузера. Я не могу использовать это, потому что мне нужно передать файл (на USB-накопителе) нескольким людям, и они не могут изменить флаги своего браузера.
сервер размещен на codeandbox. клиент размещен по адресу «file://». как файл:// может подключиться к серверу codeandbox для связи друг с другом?
Почему вы не можете разместить файл на локальном сервере?
мне как бы нужно записать его на USB-накопитель, и я не знаю, как это сделать. возможно я смогу поискать это, спасибо.
Во-первых, протокол 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 кажется сервисом нового поколения, и я с нетерпением жду возможности изучить его и поработать с ним.
Я в замешательстве. При чем здесь коды и ящик
file://
? И какое отношениеfile://
имеет кsocket.io
? Socket.io поверхfile://
даже не имеет смысла, несмотря на ограничения.