node.js - socket.io 客户端在 ionic 应用程序中给出 cors 错误

标签 node.js angular websocket socket.io ionic3

我正在尝试使用 node.js socket.io 和 ionic 4 实现聊天应用程序,但我在客户端收到 cros 策略错误

这是我的 Node.js 服务器

const path = require('path');
const http = require('http');
const express = require('express');
const socketIO = require('socket.io');
const {Users} = require('./utils/users');
const publicPath = path.join(__dirname, '../public');
const port = process.env.PORT || 3000;
var app = express();
var server = http.createServer(app);
var io = socketIO(server);
var users = new Users();
app.use(express.static(publicPath));
app.use( (req, res, next) => {
  res.header("Access-Control-Allow-Origin", "http://localhost:8100"); //The ionic server
  res.header("Access-Control-Allow-Credentials", "true");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});
io.on('connection', (socket) => {
  console.log('New user connected', socket.id);
    socket.on('setName', function (data) {
      console.log(data);
      socket.id = data.name;
  });

这是我的 ionic 客户端,我正在使用 ngx-socket-io 插件作为 socket.io 客户端。

import { Component } from "@angular/core";
import { Router } from "@angular/router";
import { NavController } from "@ionic/angular";
import { Socket } from "ngx-socket-io";
@Component({
  selector: "app-home",
  templateUrl: "home.page.html",
  styleUrls: ["home.page.scss"]
})
export class HomePage {

      constructor(
    private router: Router,
    private navCtrl: NavController,
    private api: ApiService,
    private socket: Socket

  ) {
       this.socket.connect();
    this.socket.emit("createMessage", "from ionic ");
    }
}

这是我在应用程序模块上的 socketIO 配置

import { SocketIoModule, SocketIoConfig } from "ngx-socket-io";
const config: SocketIoConfig = {
  url: "https://appName.herokuapp.com/",
  options: {}
};

@NgModule({
  declarations: [AppComponent],
  entryComponents: [],
  imports: [
    BrowserModule,
    ReactiveFormsModule,
    SocketIoModule.forRoot(config),
    IonicStorageModule.forRoot(),
    IonicModule.forRoot(),

这是我遇到的错误

Access to XMLHttpRequest at 'https://myappName.herokuapp.com/socket.io/?EIO=3&transport=polling&t=MdcwjRC' from origin 'http://localhost:8100' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

最佳答案

尝试以下操作

app.use(function(req, res, next) {
  res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8100');
  res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
  res.setHeader('Access-Control-Allow-Methods', 'GET,POST,OPTIONS,DELETE,PUT');
  res.setHeader('Access-Control-Allow-Credentials', true);
  next();
});

如果不行,尝试使用CORS包,

安装它 npm install cors --save

使用:

const cors = require("cors"); 
const corsOptions = { 
   origin: "*", 
   credentials: true 
};
app.use(cors(corsOptions)); 

关于node.js - socket.io 客户端在 ionic 应用程序中给出 cors 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55508812/

相关文章:

scala - 理解 Concurrent.unicast 的参数

javascript - Express gzip 压缩问题

node.js - 重定向 URI 未正确注册到 DocuSign

angular - 如何在 ionic 的同一页面中调整模态大小?

typescript - 在 angular2 typescript 应用程序中使用 polymer 纸对话框

javascript - HTML5 Socket.IO 在 C++ 中可用吗?

ember.js - EmberJS 和 WebSocket |最好的方法?

javascript - 在 Node 中形成元素数组键并表示

javascript - Node js 重用现有的 buff 调用

大型项目列表的 Angular 2 性能优化