Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 否';访问控制允许原点';请求的资源上存在标头。节点服务器,我已将原点应用于Cors_Node.js_Http_Server_Axios_Cors - Fatal编程技术网

Node.js 否';访问控制允许原点';请求的资源上存在标头。节点服务器,我已将原点应用于Cors

Node.js 否';访问控制允许原点';请求的资源上存在标头。节点服务器,我已将原点应用于Cors,node.js,http,server,axios,cors,Node.js,Http,Server,Axios,Cors,我意识到在这些问题上有一百万个问题,我知道自从我点击了每一个问题,没有一个问题解决了我的问题 我的cors设置: const io = require("socket.io")(server, { cors: { origin: "*",//'https://leetbattle.vercel.app', have tried both, none work methods: ["GET, POST"],

我意识到在这些问题上有一百万个问题,我知道自从我点击了每一个问题,没有一个问题解决了我的问题

我的cors设置:

const io = require("socket.io")(server, {
    cors: {
      origin: "*",//'https://leetbattle.vercel.app', have tried both, none work
      methods: ["GET, POST"],
      transports: ['websocket', 'polling'],
      credentials: true
    },
    forceNew: true,
    reconnection: false,
    perMessageDeflate: false,
    allowEIO3: true
  });
服务器端的API调用:

const handleRun = async (roomName: string, playerNumber: string) => {
      playerNumberRun = playerNumber
      roomNameRun = roomName
      app.route("/run").post((req: any, res: any) => { 
        res.header("Access-Control-Allow-Origin", "*");
        data.source_code = req.body.code.code;
        axios({
          url: process.env.VM_URL,
          method: "POST",
          data: data,
        })
          .then(async (req: any, res: any) => {
            //first call generates a token
            await new Promise((resolve) => setTimeout(resolve, 1000)); // 1 sec
            //after waiting, use the token to get the res.data.stdout which is
            //what I want to send to frontend using sockets
            axios
              .get(process.env.VM_URL+ '/'+ req.data.token)
              .then((req: any, res: any) => {
                if (!req) {
                  console.log("no output");
                }
                output.codeOutput = req.data.stdout;
                output.errorOutput = req.data.stderr;
                sendCode(roomNameRun, output, playerNumberRun);
              })
          })
          .catch((err: Error) => {
            io.to(roomNameRun).emit("serverError", playerNumberRun);
            console.log(err);
          });
      });
      
    };
我在前端对路线的呼叫:

const onExecute = async (code) => {
    setRunIsLoading(true);
    socket.emit("run", gameCode, playerNumber);
    axios({
      method: "POST",
      url: BACKEND_URL+"/run",
      data: { code },
    }).catch((error) => {
      console.log(error);
      setRunIsLoading(false);
    });
  };
我正在部署Vercel和Heroku(后端) 您可以自己在上尝试错误

所有这些都在LOCALHOST上工作,这让我更加困惑

您会注意到,套接字功能正常,但当您按“运行”时,网络选项卡中的请求(带有飞行前请求)处于挂起状态,大约30秒后被取消,并在标题中向您发送错误消息

如果有人能帮助我,我将永远感激,因为这(可能)是我“完成”项目之前的最后一个错误。老实说,我正在考虑切换到GraphQL而不是REST,但这是一个不同的问题


我会告诉你你想知道的一切。谢谢。

您刚刚为Socket.io启用了cors。您也应该为api调用启用express.js cors!
使用此选项启用它:

在函数中,
app.route().post()在做什么?这似乎是错误的。调用的
handleRun()
来自哪里?当用户按下“run”按钮时,我向服务器发出一个信号,该信号触发handleRun(),并向路由发出post请求。我还发送了按它的播放号码和房间号码。是的,这不是一个正确的设计。您不能仅为即将到来的请求安装路由。首先,无法卸载该路由,因此现在它已永久安装。然后,下次调用该函数时,它会作为副本再次安装(这会造成内存泄漏)。而且,该路由并不是只为一个用户安装的,而是为所有用户安装的。路线是全球性的。它们适用于整个服务器和来自所有用户的所有传入请求。那类代码需要不同的设计。是的,我明白了。我将把它改写成更加用户特定的内容。谢谢你的建议!我自己可能不会想到的。你能详细说明一下吗?我在我的路由中添加了对“cors()”的调用,但仍然显示相同的错误。还尝试在origin上向app添加配置。使用(cors({…})请共享浏览器控制台快照以查看您的请求错误。您可能知道,cors请求分两步处理。首先是使用OPTIONS方法的检查请求,然后是主请求。