У меня есть бэкэнд -сервер, написанный в ржавчине, используя actix_web. У меня также есть фронт, который написан в JavaScript с использованием React и Next.js.
Frontend должен сделать запросы на бэкэнд, который может занять несколько минут или дольше. Из -за того, что это не работает должным образом (запросы JS. Глобальное государство в зависимости от результата задачи.
Frontend должен проверять каждые несколько секунд (3000 мс), если задача успешно выполняется. Похоже, что запрос на проверку обновления статуса по -прежнему занимает некоторое время и не завершен, поскольку ни на вкладке сети, ни консоли. Соответствующий код: < /p>
Соответствующий код Backend Main.rs < /p>
#[allow(non_snake_case)]
#[derive(Clone)]
/// Current state of the application used to keep track of the logged in users, DoS/Brute force
/// attack requests and sharing a instance of the System struct.
struct AppState {
login_requests: Arc<
Mutex<
HashMap<
String, /* IP Adress of caller */
(
u128, /* Unix Timestamp of last request */
u64, /* Number of requests since last reset */
),
>,
>,
>,
login_token: Arc,
system: Arc,
username: Arc,
net_down: Arc,
net_up: Arc,
net_interface: Arc,
cpu_usage: Arc,
net_connected_interfaces: Arc,
update_jobs: Arc
}
impl AppState {
/// Initiate a new AppState
fn new() -> Self {
let random_string: Vec = (0..128).map(|_| rand::random::()).collect();
AppState {
login_requests: Arc::new(Mutex::new(HashMap::new())),
login_token: Arc::new(Mutex::new(
String::from_utf8_lossy(&random_string).to_string(),
)),
system: Arc::new(Mutex::new(System::new())),
username: Arc::new(Mutex::new(String::new())),
net_up: Arc::new(Mutex::new(0_f64)),
net_down: Arc::new(Mutex::new(0_f64)),
net_interface: Arc::new(Mutex::new(String::new())),
net_connected_interfaces: Arc::new(Mutex::new(0_i32)),
cpu_usage: Arc::new(Mutex::new(0_f32)),
update_jobs: Arc::new(RwLock::new(HashMap::new()))
}
}
...
// Left out as it would make this code block very long
}
#[derive(Debug)]
#[derive(Clone)]
enum BackgroundTaskState {
Success,
Fail,
SuccessOutput(String),
FailOutput(String),
Pending
}
// Route that is used to check if a task aka. job has already finished
#[get("/api/fetchJobStatus/{jobId}")]
async fn fetch_job_status(
session: Session,
state: Data,
path: web::Path
) -> HttpResponse {
if !is_admin_state(&session, state.clone()) {
return HttpResponse::Forbidden().body("This resource is blocked.");
}
let requested_id = path.into_inner().to_string();
let jobs = state.update_jobs.read().unwrap().clone();
let background_state = jobs.get(&uuid::Uuid::parse_str(&requested_id).unwrap());
dbg!(&jobs);
fn clear_task(state: Data, task: String) {
let mut jobs = state.update_jobs.write().unwrap().clone();
jobs.remove(&uuid::Uuid::from_str(&task).unwrap());
*state.update_jobs.write().unwrap() = jobs;
()
}
match background_state {
Some(bs) => {
match bs {
BackgroundTaskState::Success => {
clear_task(state, requested_id);
HttpResponse::Ok().finish()
},
BackgroundTaskState::Fail => {
clear_task(state, requested_id);
HttpResponse::UnprocessableEntity().finish()},
BackgroundTaskState::SuccessOutput(s) =>{
clear_task(state, requested_id);
HttpResponse::Ok().body(s.clone())},
BackgroundTaskState::FailOutput(f) => {
clear_task(state, requested_id);
HttpResponse::UnprocessableEntity().body(f.clone())},
BackgroundTaskState::Pending => HttpResponse::Accepted().finish()
}
},
None => HttpResponse::InternalServerError().body("Failed to fetch background task state")
}
}
// Examplary route that starts a task/job
#[post("/api/installPackage")]
/// Install a package on the users system.
///
/// It requires the package name along side the sudo password in the request body.
/// This only works under apt, dnf and pacman.
async fn install_package(
session: Session,
json: web::Json
,
state: Data,
) -> HttpResponse {
if !is_admin_state(&session, state.clone()) {
return HttpResponse::Forbidden().body("This resource is blocked.");
}
let job_id = Uuid::new_v4();
tokio::spawn(async move {
match packages::install_package(json.packageName.to_string(), json.sudoPassword.to_string()) {
Ok(_) => state.update_jobs.write().unwrap().insert(job_id, BackgroundTaskState::Success),
Err(_) => state.update_jobs.write().unwrap().insert(job_id, BackgroundTaskState::Fail),
}});
HttpResponse::Ok().body(job_id.to_string())
}
< /code>
Соответствующие фронтальные пакеты.jsx code < /p>
function startTask(adress, options = {}, interval = 3000) {
return new Promise((resolve, reject) => {
fetch(adress, options).then((res) => {
if (res.ok) {
res.text().then((uuid) => {
let ready_for_fetch = true;
let ivd = setInterval(() => {
if (!ready_for_fetch) return;
ready_for_fetch = false
fetch(fetchURLPrefix + "/api/fetchJobStatus/" + uuid).then(
(checkRes) => {
ready_for_fetch = true;
if (checkRes.status === 200) {
clearInterval(ivd);
resolve(checkRes);
} else if (checkRes.status === 422 || checkRes.status === 500) {
clearInterval(ivd);
reject(checkRes);
}}
);
}, interval);
});
}
});
});
}
< /code>
Я контролировал сетевую деятельность, проверил ожидаемые результаты, используя командную строку, и ничто не вызывает проблемы. Запросы сети, кажется, терпят неудачу, несмотря ни на что.
Подробнее здесь: https://stackoverflow.com/questions/794 ... onnections
Бэкэнд и фронт, по -видимому, не обмениваются данными, используя медленные соединения ⇐ Javascript
Форум по Javascript
1739034137
Anonymous
У меня есть бэкэнд -сервер, написанный в ржавчине, используя actix_web. У меня также есть фронт, который написан в JavaScript с использованием React и Next.js.
Frontend должен сделать запросы на бэкэнд, который может занять несколько минут или дольше. Из -за того, что это не работает должным образом (запросы JS. Глобальное государство в зависимости от результата задачи.
Frontend должен проверять каждые несколько секунд (3000 мс), если задача успешно выполняется. Похоже, что запрос на проверку обновления статуса по -прежнему занимает некоторое время и не завершен, поскольку ни на вкладке сети, ни консоли. Соответствующий код: < /p>
Соответствующий код Backend Main.rs < /p>
#[allow(non_snake_case)]
#[derive(Clone)]
/// Current state of the application used to keep track of the logged in users, DoS/Brute force
/// attack requests and sharing a instance of the System struct.
struct AppState {
login_requests: Arc<
Mutex<
HashMap<
String, /* IP Adress of caller */
(
u128, /* Unix Timestamp of last request */
u64, /* Number of requests since last reset */
),
>,
>,
>,
login_token: Arc,
system: Arc,
username: Arc,
net_down: Arc,
net_up: Arc,
net_interface: Arc,
cpu_usage: Arc,
net_connected_interfaces: Arc,
update_jobs: Arc
}
impl AppState {
/// Initiate a new AppState
fn new() -> Self {
let random_string: Vec = (0..128).map(|_| rand::random::()).collect();
AppState {
login_requests: Arc::new(Mutex::new(HashMap::new())),
login_token: Arc::new(Mutex::new(
String::from_utf8_lossy(&random_string).to_string(),
)),
system: Arc::new(Mutex::new(System::new())),
username: Arc::new(Mutex::new(String::new())),
net_up: Arc::new(Mutex::new(0_f64)),
net_down: Arc::new(Mutex::new(0_f64)),
net_interface: Arc::new(Mutex::new(String::new())),
net_connected_interfaces: Arc::new(Mutex::new(0_i32)),
cpu_usage: Arc::new(Mutex::new(0_f32)),
update_jobs: Arc::new(RwLock::new(HashMap::new()))
}
}
...
// Left out as it would make this code block very long
}
#[derive(Debug)]
#[derive(Clone)]
enum BackgroundTaskState {
Success,
Fail,
SuccessOutput(String),
FailOutput(String),
Pending
}
// Route that is used to check if a task aka. job has already finished
#[get("/api/fetchJobStatus/{jobId}")]
async fn fetch_job_status(
session: Session,
state: Data,
path: web::Path
) -> HttpResponse {
if !is_admin_state(&session, state.clone()) {
return HttpResponse::Forbidden().body("This resource is blocked.");
}
let requested_id = path.into_inner().to_string();
let jobs = state.update_jobs.read().unwrap().clone();
let background_state = jobs.get(&uuid::Uuid::parse_str(&requested_id).unwrap());
dbg!(&jobs);
fn clear_task(state: Data, task: String) {
let mut jobs = state.update_jobs.write().unwrap().clone();
jobs.remove(&uuid::Uuid::from_str(&task).unwrap());
*state.update_jobs.write().unwrap() = jobs;
()
}
match background_state {
Some(bs) => {
match bs {
BackgroundTaskState::Success => {
clear_task(state, requested_id);
HttpResponse::Ok().finish()
},
BackgroundTaskState::Fail => {
clear_task(state, requested_id);
HttpResponse::UnprocessableEntity().finish()},
BackgroundTaskState::SuccessOutput(s) =>{
clear_task(state, requested_id);
HttpResponse::Ok().body(s.clone())},
BackgroundTaskState::FailOutput(f) => {
clear_task(state, requested_id);
HttpResponse::UnprocessableEntity().body(f.clone())},
BackgroundTaskState::Pending => HttpResponse::Accepted().finish()
}
},
None => HttpResponse::InternalServerError().body("Failed to fetch background task state")
}
}
// Examplary route that starts a task/job
#[post("/api/installPackage")]
/// Install a package on the users system.
///
/// It requires the package name along side the sudo password in the request body.
/// This only works under apt, dnf and pacman.
async fn install_package(
session: Session,
json: web::Json
,
state: Data,
) -> HttpResponse {
if !is_admin_state(&session, state.clone()) {
return HttpResponse::Forbidden().body("This resource is blocked.");
}
let job_id = Uuid::new_v4();
tokio::spawn(async move {
match packages::install_package(json.packageName.to_string(), json.sudoPassword.to_string()) {
Ok(_) => state.update_jobs.write().unwrap().insert(job_id, BackgroundTaskState::Success),
Err(_) => state.update_jobs.write().unwrap().insert(job_id, BackgroundTaskState::Fail),
}});
HttpResponse::Ok().body(job_id.to_string())
}
< /code>
Соответствующие фронтальные пакеты.jsx code < /p>
function startTask(adress, options = {}, interval = 3000) {
return new Promise((resolve, reject) => {
fetch(adress, options).then((res) => {
if (res.ok) {
res.text().then((uuid) => {
let ready_for_fetch = true;
let ivd = setInterval(() => {
if (!ready_for_fetch) return;
ready_for_fetch = false
fetch(fetchURLPrefix + "/api/fetchJobStatus/" + uuid).then(
(checkRes) => {
ready_for_fetch = true;
if (checkRes.status === 200) {
clearInterval(ivd);
resolve(checkRes);
} else if (checkRes.status === 422 || checkRes.status === 500) {
clearInterval(ivd);
reject(checkRes);
}}
);
}, interval);
});
}
});
});
}
< /code>
Я контролировал сетевую деятельность, проверил ожидаемые результаты, используя командную строку, и ничто не вызывает проблемы. Запросы сети, кажется, терпят неудачу, несмотря ни на что.
Подробнее здесь: [url]https://stackoverflow.com/questions/79423587/backend-and-frontend-do-not-appear-to-exchange-data-using-slow-connections[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия