【问题标题】:Socket IO CORS issue when using a domain for server将域用于服务器时出现套接字 IO CORS 问题
【发布时间】:2020-06-08 22:26:03
【问题描述】:

当我从域而不是服务器 IP 调用我的服务器时,我遇到了来自套接字 io 的错误。此域适用于通过 Axios 获取数据,但失败并显示以下套接字错误:

Access to XMLHttpRequest at 
'https://api.alo.social/socket.io/EIO=3&transport=polling&t=NA9Kd2D' from 
origin 'https://apps.alo.social' has been blocked by CORS policy: The value of the 'Access- 
Control-Allow-Credentials' header in the response is '' which must be 'true' when the 
request's credentials mode is 'include'. The credentials mode of requests initiated by the 
XMLHttpRequest is controlled by the withCredentials attribute.

GET https://api.alo.social/socket.io/?EIO=3&transport=polling&t=NA9Kd2D net::ERR_FAILED

我的服务器代码如下所示:

const express = require('express')
const app = express()
const bodyParser = require('body-parser')
const cors = require('cors')
const server = require('https').createServer(app)
const getRoute = require('./routes/getRoutes')
const postRoute = require('./routes/postRoutes')
const socketIO = require('socket.io')
const io = socketIO(server)
require('dotenv').config()

let port = process.env.PORT

let whitelist = [
  'https://apps.alo.social',
  'https://api.alo.social'
]
let corsOptions = {
    origin(origin, callback) {
    if (whitelist.indexOf(origin) !== -1 || !origin) {
    console.log('Okay', origin)
    callback(null, true)
  } else {
    console.log('Not okay', origin)
    callback(new Error('Not allowed by CORS'))
  }
 }
}

app.options('*', cors())
app.use(cors(corsOptions));

app.use(express.static('public'))

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))


io.on('connection', function (socket) {
  app.use(function (req, res, next) {
    res.io = io
    next()
  })

  socket.on('pushMessage', function (data) {
    // console.log('pushMessage socket', data)
    io.emit('pushMessage', data)
  })
})

app.get('/', (req, res) => {
  res.send(`Server is up into port ${port}`)
})

app.use('/api/get', getRoute)
app.use('/api/post', postRoute)

app.listen(port, () => console.log(`Server is up into port ${port}`))

module.exports = { app: app, server: server }

我定义套接字的客户端是这样的:

import socketIOClient from 'socket.io-client'

let serverSocket = 'https://api.alo.social/'

let socket = socketIOClient(serverSocket)

并像这样调用套接字:

socket.emit('pushMessage', messageData)

socket.on('pushMessage', messageData => { console.log(messageData) })

有人可以帮忙吗?

【问题讨论】:

  • 在 devtools 的 Net 选项卡中向下钻取以验证标头。按照错误指示更改响应标头,然后重试
  • 标头显示错误:Referrer Policy: no-referrer-when-downgrade

标签: node.js reactjs socket.io


【解决方案1】:

修改server.js中的io配置后解决:

const io = module.exports.io = require('socket.io').listen(server, {
    handlePreflightRequest: (req, res) => {
    const headers = {
      "Access-Control-Allow-Headers": "Content-Type, Authorization",
      "Access-Control-Allow-Origin": '*',
    };
    res.writeHead(200, headers);
    res.end();
  }
})

server.listen(port)

【讨论】:

    猜你喜欢
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2011-03-16
    • 2017-07-08
    • 2021-08-30
    • 2021-07-29
    • 1970-01-01
    相关资源
    最近更新 更多