РЕДАКТИРОВАТЬ
Моя проблема заключается в том, что я хочу, чтобы клиент запускался при появлении сообщения типа «Имя пользователя уже занято» и просто сделал небольшое изменение на ярлыке «Имя пользователя» "вместо того, чтобы писать всю страницу новой.
Хорошо, я думаю, что вижу проблему, с которой вы сталкиваетесь.
Предположим, у вас есть страница на клиенте с <form>
такой как это:
<form id="myform" action="/register" method="post">
<label for="fname">First name:</label>
<input type="text" name="fname"><br><br>
<label for="lname">Last name:</label>
<input type="text" name="lname"><br><br>
<input type="submit" value="Submit">
</form>
Когда пользователь нажимает кнопку Submit
, его браузер отправит запрос POST
, перенаправив страницу пользователя.
Если я правильно понимаю, вы хотите отправить этот запрос без перенаправления пользователя.
Если это действительно так, я бы использовал fetch (или что-то подобное) для выполнения этой работы.
Итак, на странице клиента вы должны сделать что-то вроде этого:
Сначала добавьте эту опору в форму:
...
<form onsubmit="submitForm(event)">
...
Затем добавьте что-то вроде этого сценария:
<script type="text/javascript">
async function submitForm(event) {
event.preventDefault(); // This will keep the user from being redirected
try {
const username = getUsernameValue(); // get the value from the input or something
// Fetch will send a POST request to /register without navigating the page
const response = await fetch('/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
// The body is what will be in req.body on the server
body: JSON.stringify({
username: username
})
});
const responseData = response.json();
/*
Assuming the server returns some structure like:
{
error: "Username is already taken"
}
*/
if (responseData.error && responseData.error === 'Username is already taken') {
// Do something here
} else {
console.log("Everything is OK");
}
} catch(err) {
console.error('something went wrong', err);
}
}
</script>
Оригинальный ответ
Socket.IO (в более широком смысле, Websockets) и POST (API-интерфейсы REST) функционируют по-разному, и каждый из них может помочь решить различные проблемы.
Для описанной вами ситуации я продолжу использовать REST API.
Я рекомендую прочитать немного о Express и о том, как отправить ответ .
Вот некоторый псевдокод, который, будем надеяться, Направьте вас в правильном направлении:
app.post("/register", function(req,res){
const { username, email, password } = req.body;
if (!isUsernameUnique(username) || !isEmailUnique(email)) {
return res.status(400).send('Username is already taken');
}
// Save in Database
...
...
...
// Everything is good now
res.send("Created user");
});