当前位置: 首页 > 知识库问答 >
问题:

我使用带有react的socketio作为前端和节点,并使用express js来制作一个应用程序

单于善
2023-03-14

当我试图在前端使用socketio客户端连接到后台时,它显示出错误,从起源'http://localhost:8080/socket.io/?eio=4&transport=polling&t=nok7aq9'访问XMLHttpRequest已被CORS策略阻止:对飞行前请求的响应没有通过访问控制检查:请求的资源上没有'access-control-allog-origin'标头。

import React, { Component, Fragment } from "react";

import openSocket from "socket.io-client";
import Post from "../../components/Feed/Post/Post";
import Button from "../../components/Button/Button";
import FeedEdit from "../../components/Feed/FeedEdit/FeedEdit";
import Input from "../../components/Form/Input/Input";
import Paginator from "../../components/Paginator/Paginator";
import Loader from "../../components/Loader/Loader";
import ErrorHandler from "../../components/ErrorHandler/ErrorHandler";
import "./Feed.css";

class Feed extends Component {
  state = {
    isEditing: false,
    posts: [],
    totalPosts: 0,
    editPost: null,
    status: "",
    postPage: 1,
    postsLoading: true,
    editLoading: false,
  };

  componentDidMount() {
    fetch("http://localhost:8080/feed/status", {
      headers: {
        Authorization: "Bearer " + this.props.token,
      },
    })
      .then((res) => {
        if (res.status !== 200) {
          throw new Error("Failed to fetch user status.");
        }
        return res.json();
      })
      .then((resData) => {
        console.log("status fetched ", resData.status);
        this.setState({ status: resData.status });
      })
      .catch(this.catchError);

    this.loadPosts();
    console.log("openSocket", openSocket);
    const socket = openSocket("http://localhost:8080/", {
      transports: ["polling", "websocket"],
      transportOptions: {
        polling: {
          extraHeaders: { "Access-Control-Allow-Origin": "*" },
        },
      },
    });
    socket.emit("connection", { data: "data" });
    socket.on("posts", (data) => {
      if (data.action === "create") {
        this.addPost(data.post);
      }
    });
  }





backend code 

mongoose
  .connect(
    "mongodb://chitesh:pass123@cluster0-shard-00-00.ulx1q.mongodb.net:27017,cluster0-shard-00-01.ulx1q.mongodb.net:27017,cluster0-shard-00-02.ulx1q.mongodb.net:27017/feed?ssl=true&replicaSet=atlas-demxn2-shard-0&authSource=admin&retryWrites=true&w=majority",
    { useNewUrlParser: true, useUnifiedTopology: true }
  )
  .then((result) => {
    const server = app.listen(8080); // this basically return us the server
    const io = require("./socket.js").init(server);
    // websockets uses http protocols  the basis
    //so we are passing our http based server to the function
    // to create a websocket connection

    // we are setting up a function
    // to be executed whener a new connection is made

    io.on("connection", (socket) => {
      console.log("Client connected");
    });
  })
  .catch((error) => {
    console.log(error);
  });


socket.js 

const { listenerCount } = require("./models/post");

let io;
module.exports = {
  init: (httpServer) => {
    io = require("socket.io")(httpServer);
    return io;
  },
  getIO: () => {
    if (!io) {
      let error = new Error("Socket.io is not initialized");
      throw error;
    }`enter code here`
    return io;
  },
};

共有1个答案

金伟
2023-03-14

看一下express CORS中间件。您需要允许将LocalHost:3000用作Origin。

您可以使用类似

var express = require('express')
var cors = require('cors')
var app = express()

var corsOptions = {
origin: 'http://localhost:3000',
}

app.use(cors(corsOptions))
 类似资料:
  • 我已经成功地将我的nodejs后端和PostgreSQL数据库连接到我的ubuntu服务器。我还安装了nginx作为反向代理,当我访问浏览器上的公共ip地址时,它正在工作。 我的问题是,当我关闭Node.js服务器,安装pm2并正确配置pm2时,当我试图加载我的IOS模拟器时,会出现应用程序内的错误,但没有加载任何东西。(我将本地数据库中的所有内容复制到ubuntu数据库中,因此必须显示相同的帖子

  • 问题内容: 我有两个单独的节点应用程序。我希望其中一个能够在代码中的某个时刻启动另一个。我将如何去做? 问题答案: 使用。它与相似,但是用于创建V8的全新实例。因此,它专门用于运行Node的新实例。如果您只是执行命令,请使用或。 请注意,默认情况下使用时,流与父级关联。这意味着所有输出和错误都将在父进程中显示。如果您不希望与父级共享流,则可以在选项中定义属性: 然后,您可以将流程与主流程的流分开处

  • 我的CQ5中的一些页面。5.申请没有“jcr:content”节点。由于节点不存在,这些特定页面的属性不存在,用户无法修复。我想添加一个按钮,允许用户在缺少节点时添加节点。我已经能够添加一个按钮“Fix Properties”,它附带了一个自定义函数来检索现有节点,并且我能够检查jcr:content节点是否存在。我在任何地方都找不到关于如何从头创建节点的文档。我想这是一件很平常的事,但几乎找不到

  • 本文向大家介绍详解使用React制作一个模态框,包括了详解使用React制作一个模态框的使用技巧和注意事项,需要的朋友参考一下 模态框是一个常见的组件,下面让我们使用 React 实现一个现代化的模态框吧。 组件设计 模态框想必大家都很熟悉,是工作中常用的组件,可以让我们填写或展示一些信息而不必打开一个新页面。在开始编码之前,我们先来了解一个 React 模态框组件应该如何设计。 React 是一

  • 创建一个简单的火炬应用程序,它可以放在相机闪光灯上并将其关闭。这个应用程序应该有一个简单的用户界面,可以打开闪光灯,也可以关闭它。连续使用1分钟后,用户界面应该提示用户他想继续使用火炬。如果用户说是,火炬将继续亮一分钟,这个循环将重复。如果用户说不,火炬将被推迟。 创建一个简单的火炬应用程序很容易,我已经制作了火炬应用程序,但问题中提到的第二件事是在1分钟后做出提示,我不明白有人能帮忙吗? 这是我

  • 一般来说,我可以做到这一点,一切看起来都一样, 但也许以后我不能把我的应用程序上传到谷歌开发者控制台? 或者我会在实现谷歌libs方面遇到问题?