如何在next js中制作类似leetcode的在线代码编译器?

问题描述 投票:0回答:1

我有一个问题,我和我的一个朋友决定创建一个网站,让学童可以来学习编程、解决问题并参加编程竞赛。我们在 NextJS 中做的网站,并使用 Material UI、TailwindCSS。 Sanity IO 和 MongoDB 是后端。我还没有发布,站点链接:https://brackets.vercel.app/ 到目前为止,一切都很顺利,但我被困在一个地方。问题是,解题页面的右侧会有一个完整的问题,右侧会有一个代码编译器,用户可以坐在我们的网站上解决问题,而无需使用单独的编辑器,就像 Leetcode、edabit 一样,以及其他一些在线判断。我们的问题解决页面:(https://brackets.vercel.app/problemset/two-sum)我们无法以任何方式将任何代码编译器引入 NextJS。即使你可以在这里编码,但是你无法运行。我们在 YouTube 上找到了一个关于如何在 MERN Stack 上构建编译器的视频,但我们不在这里工作,尽管编码与他完全相同。

据我所知,我通过谷歌和Stackoverflow解决了这些小错误,但最终还是没能解决,请注意,他用Mac,我们用Windows,我认识的所有开发人员都来自编程英雄,连续两天。我根据要求召开了多次现场会议,但都没有找到任何解决方案。然后我得到了另一个博客,他复制到了 React,我们也复制到了 React,问题是每当我想将它带到 NextJs 时,我都会收到两个错误,“Can't set property localStorage of # which has only a getter”已解决,但是在本地服务器上运行,每当我重新加载时,它都会给出“

loaclStorage is not defined
”错误,

有另一个解决方案,但同样的情况,我去部署 Vercel 出现错误,我已附上所有教程链接和屏幕截图,先生。我尽了最大努力,与很多人交谈,但没有人对此无能为力。所以我最后还是惹恼了你,没有放弃。我该怎么做才能帮助我?我想我们离不开你们的合作。

我已遵循本教程 = https://www.youtube.com/watch?v=RZ66yGyEKFg(视频播放 24 分钟后无法使用)

我已经尝试过这个博客 - https://medium.com/dsckiit/make-your-own-online-compiler-in-react-%EF%B8%8F-b06bc29dd202(它正在反应,但当我将其转换为 nextJs 它给了我错误)

代码:

import React, { Component } from "react";

import "./Compiler.css";
export default class Compiler extends Component {
  constructor(props) {
    super(props);
    this.state = {
      input: localStorage.getItem('input')||``,
      output: ``,
      language_id:localStorage.getItem('language_Id')|| 2,
      user_input: ``,
    };
  }
  input = (event) => {
 
    event.preventDefault();
  
    this.setState({ input: event.target.value });
    localStorage.setItem('input', event.target.value)
 
  };
  userInput = (event) => {
    event.preventDefault();
    this.setState({ user_input: event.target.value });
  };
  language = (event) => {
   
    event.preventDefault();
   
    this.setState({ language_id: event.target.value });
    localStorage.setItem('language_Id',event.target.value)
   
  };

  submit = async (e) => {
    e.preventDefault();

    let outputText = document.getElementById("output");
    outputText.innerHTML = "";
    outputText.innerHTML += "Creating Submission ...\n";
    const response = await fetch(
      "https://judge0-ce.p.rapidapi.com/submissions",
      {
        method: "POST",
        headers: {
          "x-rapidapi-host": "judge0-ce.p.rapidapi.com",
          "x-rapidapi-key": "*****************",
          "content-type": "application/json",
          accept: "application/json",
        },
        body: JSON.stringify({
          source_code: this.state.input,
          stdin: this.state.user_input,
          language_id: this.state.language_id,
        }),
      }
    );
    outputText.innerHTML += "Submission Created ...\n";
    const jsonResponse = await response.json();

    let jsonGetSolution = {
      status: { description: "Queue" },
      stderr: null,
      compile_output: null,
    };

    while (
      jsonGetSolution.status.description !== "Accepted" &&
      jsonGetSolution.stderr == null &&
      jsonGetSolution.compile_output == null
    ) {
      outputText.innerHTML = `Creating Submission ... \nSubmission Created ...\nChecking Submission Status\nstatus : ${jsonGetSolution.status.description}`;
      if (jsonResponse.token) {
        let url = `https://judge0-ce.p.rapidapi.com/submissions/${jsonResponse.token}?base64_encoded=true`;

        const getSolution = await fetch(url, {
          method: "GET",
          headers: {
            "x-rapidapi-host": "judge0-ce.p.rapidapi.com",
            "x-rapidapi-key": "******************",
            "content-type": "application/json",
          },
        });

        jsonGetSolution = await getSolution.json();
      }
    }
    if (jsonGetSolution.stdout) {
      const output = atob(jsonGetSolution.stdout);

      outputText.innerHTML = "";

      outputText.innerHTML += `Results :\n${output}\nExecution Time : ${jsonGetSolution.time} Secs\nMemory used : ${jsonGetSolution.memory} bytes`;
    } else if (jsonGetSolution.stderr) {
      const error = atob(jsonGetSolution.stderr);

      outputText.innerHTML = "";

      outputText.innerHTML += `\n Error :${error}`;
    } else {
      const compilation_error = atob(jsonGetSolution.compile_output);

      outputText.innerHTML = "";

      outputText.innerHTML += `\n Error :${compilation_error}`;
    }
  };
  render() {
 
    return (
      <>
        <div className="row container-fluid">
          <div className="col-6 ml-4 ">
            <label htmlFor="solution ">
              <span className="badge badge-info heading mt-2 ">
                <i className="fas fa-code fa-fw fa-lg"></i> Code Here
              </span>
            </label>
            <textarea
              required
              name="solution"
              id="source"
              onChange={this.input}
              className=" source"
              value={this.state.input}
            ></textarea>

            <button
              type="submit"
              className="btn btn-danger ml-2 mr-2 "
              onClick={this.submit}
            >
              <i className="fas fa-cog fa-fw"></i> Run
            </button>

            <label htmlFor="tags" className="mr-1">
              <b className="heading">Language:</b>
            </label>
            <select
              value={this.state.language_id}
              onChange={this.language}
              id="tags"
              className="form-control form-inline mb-2 language"
            >
              <option value="54">C++</option>
              <option value="50">C</option>
              <option value="62">Java</option>
              <option value="71">Python</option>
            </select>
          </div>
          <div className="col-5">
            <div>
              <span className="badge badge-info heading my-2 ">
                <i className="fas fa-exclamation fa-fw fa-md"></i> Output
              </span>
              <textarea id="output"></textarea>
            </div>
          </div>
        </div>

        <div className="mt-2 ml-5">
          <span className="badge badge-primary heading my-2 ">
            <i className="fas fa-user fa-fw fa-md"></i> User Input
          </span>
          <br />
          <textarea id="input" onChange={this.userInput}></textarea>
        </div>
      </>
    );
  }
}

这在 NextJS 上不起作用,给出错误 本地存储未定义

javascript reactjs next.js
1个回答
-1
投票

嘿,你的问题解决了吗?虽然我是Python爱好者,但我找到了一个 nextjs 的有用资源。这是 fcc 的链接:https://youtu.be/GnodscC2p-A?si=nwokwgMAinjpJdXg

© www.soinside.com 2019 - 2024. All rights reserved.