Node.js 否';访问控制允许原点';请求的资源上存在标头。节点服务器,我已将原点应用于Cors
我意识到在这些问题上有一百万个问题,我知道自从我点击了每一个问题,没有一个问题解决了我的问题 我的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"],
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方法的检查请求,然后是主请求。