reactjs 未捕获的引用错误:在React中使用simple-peer包未定义global

eimct9ow  于 2023-08-04  发布在  React
关注(0)|答案(2)|浏览(112)

我正在尝试在Vite(React)中构建一个实时视频和音频流媒体平台。
我尝试了peerjs,它工作得很好,但我必须传递查看器的MediaStream对象才能连接,但我希望我的应用程序是一对多的,这意味着只有管理员才能流媒体。我不想流式传输观众的媒体,也不想请求麦克风和摄像机权限,因为我不会使用它。
作为替代方案,我尝试了simple-peer,但它给出了一个错误,我试图解决了几个小时,但得到了更多的错误。

browser.js:16 Uncaught ReferenceError: global is not defined
at node_modules/randombytes/browser.js (browser.js:16:14)
at __require (chunk-J43GMYXM.js?v=ca9856dd:11:50)
at node_modules/simple-peer/index.js (index.js:4:21)
at __require (chunk-J43GMYXM.js?v=ca9856dd:11:50)
at dep:simple-peer:1:16

字符串
我更喜欢使用peerjs,因为它已经为我工作,但如果你知道我的问题的解决方案或有任何更好的工作替代方案,这将是伟大的。
下面是我的代码以供参考:

import { Button } from "@mui/material";
import { useEffect, useState } from "react";
import { useSelector } from "react-redux";
import { toast } from "react-toastify";
import { Socket } from "socket.io-client";
import VideoPlayer from "../components/videoplayer";
import { RootState } from "../redux/store";
import Peer from "simple-peer";

function DevPage() {
  const [myStream, setMyStream] = useState<MediaStream>();
  const [hisStream, setHisStream] = useState<MediaStream>();
  const [users, setUsers] = useState<string[]>([]);
  const [me, setMe] = useState<string>();

  const getStream: () => Promise<MediaStream> = (): Promise<MediaStream> =>
    navigator.mediaDevices.getUserMedia({ video: true, audio: true });

  const socket: Socket = useSelector<RootState, Socket>(
    (state: RootState): Socket => state.socket
  );

  useEffect((): (() => void) => {
    if (socket) {
      setMe(socket.id);
      socket.on("users", ({ allUsers }: { allUsers: string[] }): void => {
        setUsers(allUsers);
      });
      getStream()
        .then((stream: MediaStream): void => {
          setMyStream(stream);
        })
        .catch((err: Error): void => {
          toast.error(err.message);
        });
    }
    return () => {};
  }, [socket]);

  const callPeer = () => {
    const peer = new Peer();
  };

  return (
    <div className="bg-primary-700 min-h-screen w-full">
      {myStream && <VideoPlayer stream={myStream} />}
      {hisStream && <VideoPlayer stream={hisStream} />}
      <div className="text-white flex gap-2 p-4 flex-wrap justify-around">
        {users.map(
          (user, idx) =>
            user != me && (
              <Button
                color="info"
                variant="contained"
                key={idx}
                onClick={() => {}}
              >
                {user}
              </Button>
            )
        )}
      </div>
    </div>
  );
}

export default DevPage;


Video Player只是我播放媒体流的视频元素。
分享任何关于如何连接peerjs没有媒体流或使一个空的媒体流或修复此错误的知识。

jdgnovmf

jdgnovmf1#

它与global this重命名为globalThis有关,只需将"<script>const global = globalThis;</script>"添加到html文件中。

<body>
    <div id="root"></div>
    <script type="module" src="/src/main.jsx"></script>
    <script>const global = globalThis;</script>
  </body>

字符串

nwwlzxa7

nwwlzxa72#

问题出在vite如果您使用npm create vite@latest{projectName}创建了Web应用
那么你的src文件夹中就会有一个vite.congfig.js。
简单地去那里然后加上

define: {
global: {}},

字符串
所以最终的vite.config.js看起来像这样x1c 0d1x

相关问题