Как я могу делать запросы HTTP и Websocket одновременно на одном сервере? - PullRequest
0 голосов
/ 08 июля 2020

Я пытаюсь запустить сервер, выполняющий запросы HTTP и Websocket. HTTP-запросы будут использоваться для извлечения данных из локального файла с именем «geo-data.json», который мне нужен для отображения карты Нью-Йорка C с использованием D3. js и библиотеки topo json.

Я использую Node.js для запуска сервера. Мой файл package. json выглядит так:

{
  "name": "inputusername_showlistofusers",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
  "test": "echo \"Error: no test specified\" && exit 1",
  "start": "node server.js"
 },
  "author": "",
  "license": "ISC",
  "dependencies": {
  "node-geocoder": "^3.27.0",
  "ws": "^7.3.0"
 }
}

Моя конфигурация Websocket на стороне клиента выглядит так:

var wsUri = "ws://localhost:8080";
var ws = new WebSocket(wsUri);

ws.onopen = function (evt) {
    console.log("1. Connected (from Client)")
}

ws.onmessage = function (message) {
    var messageArray = JSON.parse(message.data)
    console.log("5. This is the list of user names:", messageArray)
}

Кроме того, на стороне клиента я включаю свои Код D3 для чтения геоданных из файлов «geo-data.json» и «ny c -streets.json» с помощью D3. json:

d3.json('geo-data.json', function (error, data) {
//code
}

d3.json('nyc-streets.json', function (error, data) {
//code
}

на стороне сервера , Я использую веб-сокеты для трансляции сообщения. Код выглядит так:

var WebSocket = require("ws");
wss = new WebSocket.Server({ port: 8080 });

wss.on("connection", function connection(ws) {  

    console.log("2. Connected (from Server)")

    ws.on("message", function incoming(message) {

        console.log("3. received from the client ", message);

        wss.clients.forEach(function each(client) {
            if (client.readyState === WebSocket.OPEN) {

                client.send(JSON.stringify(message));
                console.log("7. All names connected: ", message)
             }
        })
    })
})

Проблема: когда я запускаю server. js с использованием «node server.js», код (как на клиенте, так и на сервере), требующий Websocket, работает плавно, но тот, который требует https, не имеет:

d3.json('geo-data.json', function (error, data)    

, и я получаю следующую ошибку (я открываю файл index. html с помощью File / Users…):

Доступ к XMLHttpRequest в 'file: /// Users ... "из источника' null 'заблокирован CORS policy: Запросы с перекрестным происхождением поддерживаются только для схем протоколов: http, data, chrome, chrome -extension, https.

Поэтому я попытался исправить это, используя http-сервер для запуска сервер, а также внесение следующего изменения в пакет. json: «scripts»: {start: «index.html»} Однако теперь код Websocket не работает, и я получаю следующую ошибку:

(индекс): 112 Соединение WebSocket с 'ws: // localhost: 8080 /' не удалось: Ошибка во время рукопожатия WebSocket: Неожиданный код ответа: 200

Как сделать как HTTP, так и Websocket запрашивает одновременно?

Заранее спасибо.

1 Ответ

1 голос
/ 09 июля 2020

Я собираюсь опубликовать здесь огромное количество информации, а затем резюмирую в конце. В конце концов, Web Sockets, вероятно, не тот инструмент, который вы хотите использовать. Скорее всего, веб-сокеты работают, но они немного отличаются от того, что вы ожидали. Веб-сокеты отлично подходят для постоянного общения. Для этого отлично подходят мессенджер или чат, так как вы будете постоянно проверять наличие новых сообщений.

Я предлагаю вместо этого использовать express. Вот простой файл, с которого вы можете начать: https://www.tutorialsteacher.com/nodejs/serving-static-files-in-nodejs. Он обслуживает все файлы, которые находятся в папке publi c. Вы можете переместить свои файлы в такую ​​папку.

Большая проблема в том, что функция d3.json( не подключается к вашим сокетам. Он ищет файл локально (что возможно, но в конечном итоге приводит к ошибке безопасности CORS). Эта функция отвечает за получение данных. Если вы назвали правильный URL-адрес d3.json('localhost:8080/geo-data.json в новом приложении Express, то у вас все должно получиться. Вам не нужно будет ничего делать для сетевых подключений на стороне клиента (без веб-сокетов или express на вашем клиенте)

...