Expressjs не отправляет ответ

Я делал это 100 раз, но я не уверен, что происходит в этом случае... Я отправляю учетные данные для входа со своей страницы на экспресс-сервер:

async function request(url, data) {
  data = JSON.stringify(data);
  
  const response = await fetch(url, {
    method: "POST",
    cache: "no-cache",
    headers: {
      "Content-Type": "application/json",
    },
    body: data,
  });
  console.info('response', JSON.stringify(response));
  return response.json();
}
    
$("#log-form").submit(async () => {
  const data = {
    username: $('input[name=log-user]').val(),
    password: $('input[name=log-pass]').val()
  };
  
  const result = await request("/login", data);
  console.info("log-result", JSON.stringify(result));
  if (result.status == "ok") {
    alert("You have successfully logged in!");
  } else {
    alert(result.error);
  }
  //window.location.href = "/chat";
});

Экспресс-сервер получает данные так, как должен, но, похоже, никогда не отправляет ответ обратно на страницу:

app.use(express.json());
app.use(express.urlencoded({extended: true}));

app.post('/login', async (req, res) => {
  const username = req.body.username;
  const password = req.body.password;
  
  const errString = "Incorrect usernane/password combo.";
  
  let result = await query("SELECT * FROM User WHERE name = '"+username+"'");
  result = result[0];
  
  if (result.user_id) {
    const valid = await bcrypt.compare(password, result["password"]);
    console.info('validPass', valid);
    if (valid) {
      // login and set session
      data.status = "ok";
      data.data.user = result;
      
      //req.session.user = result;
    } else {
      // invalid password
      data.status = "error";
      data.error = errString;
    }
  } else {
    // invalid password
    data.status = "error";
    data.error = errString;
  }
  console.info('data', data);
  res.status(200).send(data);
});

Строка console.info('data', data); печатает то, что должна, но ни res.json(data), ни res.send(data) не работают. Я ничего не получаю в консоли браузера, кроме исходного запроса. Никакого ответа. Что я делаю не так?

Вы не возвращаетесь.добавьте return res.status(200).json(data);

Subha 24.05.2024 09:48

Какую именно ошибку вы получаете?

Krzysztof Krzeszewski 24.05.2024 09:59

где ты определил data на сервере

traynor 24.05.2024 10:01

@KrzysztofKrzeszewski вообще никакой ошибки.

chaoskreator 24.05.2024 10:54

Данные @traynor определяются над блоком: const data = { status: 'error', data: {}, error: '' };

chaoskreator 24.05.2024 10:55

@Subha не имеет значения, будет ли он фактически возвращен или нет.

chaoskreator 24.05.2024 10:57

Что вы получаете в ответ?

Subha 24.05.2024 11:19

@chaoskreator не может воспроизвести, мне кажется, все в порядке. Я подозреваю, что в запросе произошла ошибка, но, по-видимому, нет, если он достигает строки журнала, тем не менее, я бы предложил добавить обработчики ошибок для запроса и bcrypt, и также используйте параметризованные запросы. вы также можете попробовать вернуть жестко закодированный ответ с сервера, и если это сработает, возможно, попробуйте жестко запрограммировать запрос на клиенте, чтобы сузить проблему.

traynor 24.05.2024 11:30

Просто совет по безопасности: Не используйте неэкранированные аргументы в запросах к базе данных. -- Ваша текущая обработка данных в '"+username+"' позволяет любому манипулировать данными.

Christopher 24.05.2024 14:53

@ Кристофер Кристофер У меня были заполнители, но по какой-то безумной причине я подумал, что это может быть ошибкой, но нет.

chaoskreator 24.05.2024 19:55

Если вы укажете '; DELETE FROM User; SELECT '1 в качестве значения для username, вы можете получить пустую таблицу. Строка, отправленная query(), будет: SELECT * FROM User WHERE name = ''; DELETE FROM User; SELECT '1'. -- Другая возможность: ' OR password = '<hash> в качестве имени пользователя будет предоставлен доступ в качестве «неизвестного пользователя», просто отправив общий хэш пароля. Это даже возможно, если для записи конфигурации: MultipleStatements установлено значение false.

Christopher 25.05.2024 10:03

@ Кристофер, я знаю. это было просто для тестирования.

chaoskreator 26.05.2024 00:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
12
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Изменение события отправки устранило проблему:

$("#log-form").on("submit", async (e) => {
      e.preventDefault();

Похоже, объект данных не инициализируется перед его использованием. Это потенциально может привести к ошибке ссылки или, в вашем случае, она может быть неправильно структурирована при попытке отправить ее обратно клиенту. Вы должны инициализировать данные в начале обработчика маршрута.

пусть данные = {}; // Инициализируем объект данных

Проблема была не в этом. Объект данных был инициализирован над скопированным/вставленным кодом.

chaoskreator 28.05.2024 21:28

Другие вопросы по теме