CORS проблемы с Express, Socket.ввод-вывод и Nginx

#node.js #express #sockets #nginx #cors

#node.js #выразить #сокеты #nginx #cors

Вопрос:

Я адаптировал учебник, чтобы получить простой сокет.чат ввода-вывода происходит в узле. Он работает при локальном размещении, но после отправки его на тестовый сервер я не могу получить разрешение на подключение к сокетам. Похоже, это вопрос, связанный с перекрестным происхождением, хотя я немного смущен тем, как маршрутизировать вещи в Nginx. Следование советам в связанных вопросах не помогло.

Клиентский скрипт:
var socket = io.connect('http://localhost/socket.io');

Index.js:

 const express = require('express');
const app = express();
const path = require('path');
const httpServer = require('http').createServer(app);
const io = require('socket.io')(httpServer, {
    cors:true,
    origins:["*"],
    // origins:["http://xxx.xxx.xxx.xxx:8080"],
    // transports: ['websocket'],
});


const views_path = (__dirname   '/views');

app.set('views',views_path);
app.use(express.static(__dirname   '/public'));
app.get('/', function(req,res){
    console.log('render request received');
    res.render('startPage.ejs');
});

io.sockets.on('connection', socket => {
    console.log('connection received.')
    socket.on('username', function(username) {
        socket.username = username;
        io.emit('is_online', socket.username);
    });
    //...
});

httpServer.listen(8080);
 

сайты nginx — доступны:

 server {
    server_name campfire;
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/campfire/html;

    index index.html index.htm index.nginx-debian.html;

    location ^~ /assets/ {
        gzip_static on;
        expires 12h;
        add_header Cache-Control public;
    }

    location / {
        proxy_set_header Host $host;
        #proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://localhost:8080;
    }
    location /socket.io/ {
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'Upgrade';
            proxy_http_version 1.1;
            #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_pass http://localhost:8080/socket.io/;
    }
}

 

Любые идеи приветствуются!

Ответ №1:

Надеюсь, это поможет справиться со всеми ошибками CORS

Потому что он справится с этим за вас

 const cors = require('cors');
app.use(cors());
 

Документы CORS

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

1. Привет, спасибо за ваш ответ. К сожалению, я уже пробовал это, но это ничего не исправляет.

Ответ №2:

Внесение этого изменения устранило проблему:

Клиентский скрипт: var socket = io.connect();

Этот способ использует назначение соединения по умолчанию с сокетом.