Я делал это 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) не работают. Я ничего не получаю в консоли браузера, кроме исходного запроса. Никакого ответа. Что я делаю не так?
Какую именно ошибку вы получаете?
где ты определил data на сервере
@KrzysztofKrzeszewski вообще никакой ошибки.
Данные @traynor определяются над блоком: const data = { status: 'error', data: {}, error: '' };
@Subha не имеет значения, будет ли он фактически возвращен или нет.
Что вы получаете в ответ?
@chaoskreator не может воспроизвести, мне кажется, все в порядке. Я подозреваю, что в запросе произошла ошибка, но, по-видимому, нет, если он достигает строки журнала, тем не менее, я бы предложил добавить обработчики ошибок для запроса и bcrypt, и также используйте параметризованные запросы. вы также можете попробовать вернуть жестко закодированный ответ с сервера, и если это сработает, возможно, попробуйте жестко запрограммировать запрос на клиенте, чтобы сузить проблему.
Просто совет по безопасности: Не используйте неэкранированные аргументы в запросах к базе данных. -- Ваша текущая обработка данных в '"+username+"' позволяет любому манипулировать данными.
@ Кристофер Кристофер У меня были заполнители, но по какой-то безумной причине я подумал, что это может быть ошибкой, но нет.
Если вы укажете '; DELETE FROM User; SELECT '1 в качестве значения для username, вы можете получить пустую таблицу. Строка, отправленная query(), будет: SELECT * FROM User WHERE name = ''; DELETE FROM User; SELECT '1'. -- Другая возможность: ' OR password = '<hash> в качестве имени пользователя будет предоставлен доступ в качестве «неизвестного пользователя», просто отправив общий хэш пароля. Это даже возможно, если для записи конфигурации: MultipleStatements установлено значение false.
@ Кристофер, я знаю. это было просто для тестирования.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Изменение события отправки устранило проблему:
$("#log-form").on("submit", async (e) => {
e.preventDefault();
Похоже, объект данных не инициализируется перед его использованием. Это потенциально может привести к ошибке ссылки или, в вашем случае, она может быть неправильно структурирована при попытке отправить ее обратно клиенту. Вы должны инициализировать данные в начале обработчика маршрута.
пусть данные = {}; // Инициализируем объект данных
Проблема была не в этом. Объект данных был инициализирован над скопированным/вставленным кодом.
Вы не возвращаетесь.добавьте
return res.status(200).json(data);