How to fix 'ReferenceError: document is not defined' when using ZEGOCLOUD API with Next.js?

huangapple go评论101阅读模式
英文:

How to fix 'ReferenceError: document is not defined' when using ZEGOCLOUD API with Next.js?

问题

I can provide a translation of the code part for you:

  1. 我正在为在线视频会议制作一个网络平台我正在使用 ZEGOCLOUD 作为 API使用 Next.js但是当我运行我的程序时我收到了这个错误:#ReferenceError: document is not defined
  2. import React, { useEffect, useState } from 'react';
  3. import { useRouter } from 'next/router';
  4. import { useDispatch, useSelector } from 'react-redux';
  5. import { AppDispatch, RootState } from '@/configuration/store/store';
  6. import { interview_interface, UserType } from '@/interface';
  7. import useAuthInterview from '@/configuration/hooks/useAuthInterview';
  8. import { GetInterview } from '@/configuration/slices/interview';
  9. import { ZegoUIKitPrebuilt } from '@zegocloud/zego-uikit-prebuilt';
  10. import { generatedMeetingID } from '@/functions/generatedMeetingID';
  11. const Index = () => {
  12. useAuthInterview();
  13. const dispatch = useDispatch<AppDispatch>();
  14. const router = useRouter();
  15. const params = router.query.interviewid;
  16. const user = useSelector((state: RootState) => state.interviewUser.userInfo);
  17. const [isAllow, setIsAllow] = useState<boolean>(true);
  18. const [userLoaded, setUserLoaded] = useState(true);
  19. const interviews = useSelector((state: RootState) => state.interview.interviews);
  20. useAuthInterview();
  21. const users = useSelector((state: RootState) => state.interviewUser.userInfo?.uid);
  22. useEffect(() => {
  23. // @ts-ignore
  24. if (users?.uid) {
  25. dispatch(GetInterview());
  26. }
  27. setUserLoaded(true);
  28. // @ts-ignore
  29. const getMeeting = () => {
  30. if (params?.length && userLoaded) {
  31. const interviewData = interviews.filter((item: interview_interface) => item.idinterview === params);
  32. if (interviewData.length) {
  33. const iscreator = users;
  34. if (interviewData[0].interviewtype === '1-on-1') {
  35. // compare avec l'id del 'inviter
  36. if (interviewData[0].iduser) {
  37. // compare avec la date d'aujourd'hui moment().format('l')
  38. if (interviewData[0].interviewdate) {
  39. setIsAllow(true);
  40. }
  41. } else {
  42. router.push('/entreprise/interview');
  43. }
  44. }
  45. } else {
  46. router.push('./appels');
  47. }
  48. }
  49. };
  50. getMeeting();
  51. }, [dispatch, userLoaded]);
  52. const appId = process.env.NEXT_PUBLIC_APPID;
  53. const serverSecret = process.env.NEXT_PUBLIC_SERVERSECRETE;
  54. const monInterview = async (element: any) => {
  55. // @ts-ignore
  56. const kitToken = ZegoUIKitPrebuilt.generateKitTokenForTest(
  57. // @ts-ignore
  58. appId,
  59. serverSecret,
  60. interviews[0].idinterview as string,
  61. // @ts-ignore
  62. users?.uid ? user : generatedMeetingID(),
  63. // @ts-ignore
  64. user.name ? user.name : generatedMeetingID()
  65. );
  66. // @ts-ignore
  67. const zp = await ZegoUIKitPrebuilt.create(kitToken);
  68. // @ts-ignore
  69. await zp.joinRoom({
  70. container: element,
  71. maxUsers: 50,
  72. sharedLinks: [{
  73. name: 'lien personnel',
  74. url: window.location.origin
  75. }],
  76. scenario: {
  77. mode: ZegoUIKitPrebuilt.VideoConference,
  78. }
  79. });
  80. };
  81. // @ts-ignore
  82. return (
  83. <div>
  84. <div ref={monInterview}>
  85. </div>
  86. </div>
  87. );
  88. };
  89. export default Index;

Please note that code translation might not cover all aspects, and you might need to adjust some parts depending on your specific requirements and environment.

英文:

I'm working on a web platform for online video conferencing and I'm using ZEGOCLOUD as api with next js but when I run my program I get this error #ReferenceError: document is not defined

  1. import React, {useEffect, useState} from &#39;react&#39;;
  2. import {useRouter} from &quot;next/router&quot;;
  3. import {useDispatch, useSelector} from &quot;react-redux&quot;;
  4. import {AppDispatch, RootState} from &quot;@/configuration/store/store&quot;;
  5. import {interview_interface, UserType} from &quot;@/interface&quot;;
  6. import useAuthInterview from &quot;@/configuration/hooks/useAuthInterview&quot;;
  7. import {GetInterview} from &quot;@/configuration/slices/interview&quot;;
  8. import {ZegoUIKitPrebuilt} from &quot;@zegocloud/zego-uikit-prebuilt&quot;;
  9. import {generatedMeetingID} from &quot;@/functions/generatedMeetingID&quot;;
  10. const Index = () =&gt; {
  11. useAuthInterview()
  12. const dispatch = useDispatch&lt;AppDispatch&gt;();
  13. const router=useRouter()
  14. const params=router.query.interviewid
  15. const user=useSelector((state: RootState) =&gt; state.interviewUser.userInfo)
  16. const [isAllow,setIsAllow]=useState&lt;boolean&gt;(true);
  17. const [userLoaded,setUserLoaded]=useState(true)
  18. const interviews = useSelector((state: RootState) =&gt; state.interview.interviews);
  19. useAuthInterview()
  20. const users = useSelector((state: RootState) =&gt; state.interviewUser.userInfo?.uid);
  21. useEffect(() =&gt; {
  22. // @ts-ignore
  23. if (users?.uid) {
  24. dispatch(GetInterview())
  25. }
  26. setUserLoaded(true)
  27. // @ts-ignore
  28. const getMeeting=()=&gt;{
  29. if ((params?.length &amp;&amp; userLoaded)) {
  30. const interviewData = interviews.filter((item: interview_interface) =&gt; item.idinterview === params)
  31. if (interviewData.length){
  32. const iscreator=users
  33. if (interviewData[0].interviewtype===&#39;1-on-1&#39;){
  34. // compare avec l&#39;id del &#39;inviter
  35. if (interviewData[0].iduser){
  36. // compare avec la date d&#39;aujourdhui moment().format(&#39;l&#39;)
  37. if (interviewData[0].interviewdate){
  38. setIsAllow(true)
  39. }
  40. }else{
  41. router.push(&#39;/entreprise/interview&#39;)
  42. }
  43. }
  44. }
  45. else{
  46. router.push(&#39;./appels&#39;)
  47. }
  48. }
  49. }
  50. getMeeting()
  51. }, [dispatch,userLoaded])
  52. const appId = process.env.NEXT_PUBLIC_APPID
  53. const serverSecret = process.env.NEXT_PUBLIC_SERVERSECRETE
  54. const monInterview=async (element:any)=&gt;{
  55. // @ts-ignore
  56. const kitToken=ZegoUIKitPrebuilt.generateKitTokenForTest(
  57. // @ts-ignore
  58. appId,
  59. serverSecret,
  60. interviews[0].idinterview as string,
  61. // @ts-ignore
  62. users?.uid? user:generatedMeetingID(),
  63. // @ts-ignore
  64. user.name?user.name:generatedMeetingID()
  65. );
  66. // @ts-ignore
  67. const zp=await ZegoUIKitPrebuilt.create(kitToken)
  68. // @ts-ignore
  69. await zp.joinRoom({
  70. container: element,
  71. maxUsers: 50,
  72. sharedLinks: [{
  73. name: &quot;lien personnel&quot;,
  74. url: window.location.origin
  75. }],
  76. scenario: {
  77. mode: ZegoUIKitPrebuilt.VideoConference,
  78. }
  79. })
  80. }
  81. // @ts-ignore
  82. return (
  83. &lt;div&gt;
  84. &lt;div ref={monInterview}&gt;
  85. &lt;/div&gt;
  86. &lt;/div&gt;
  87. );
  88. };
  89. export default Index;

I tried deleting everything and starting again but it didn't work, but I also tested typeof window without success.

答案1

得分: 0

Next.js 是服务器端框架,因此文档不可用于服务器端。
你可以像这样导入。

  1. import { useEffect } from "react";
  2. export default function YourComponent() {
  3. useEffect(() => {
  4. import("zego-express-engine-webrtc").then(({ ZegoExpressEngine }) => {
  5. // 使用 ZegoExpressEngine 的代码
  6. });
  7. }, []);
  8. // 组件的其余部分代码
  9. }
英文:

Nextjs is server side framework so document is not available on server side.
You can import like this.

  1. import { useEffect } from &quot;react&quot;;
  2. export default function YourComponent() {
  3. useEffect(() =&gt; {
  4. import(&quot;zego-express-engine-webrtc&quot;).then(({ ZegoExpressEngine }) =&gt; {
  5. // Your code that uses ZegoExpressEngine
  6. });
  7. }, []);
  8. // Rest of your component code
  9. }

答案2

得分: 0

感谢您的回答,它确实对我有帮助,但我只是解构了导入。

  1. const { ZegoUIKitPrebuilt } = await import("@zegocloud/zego-uikit-prebuilt");
英文:

Thanks for your answer, it really helped me, but instead of useEffect I just destructured the import.

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

  1. const {ZegoUIKitPrebuilt} = await import(&quot;@zegocloud/zego-uikit-prebuilt&quot;);

<!-- end snippet -->

huangapple
  • 本文由 发表于 2023年5月29日 16:36:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/76355812.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定