NodeJS ответ на POST с использованием Socket.IO - PullRequest
0 голосов
/ 24 апреля 2020

client (browser) POSTs значения, такие как имя пользователя, пароль, электронная почта ... Мое NodeJS приложение получает их и теперь должно сначала проверить, используется ли имя пользователя / электронная почта в базе данных, и ответить клиенту "Имя пользователя уже принято "если так.

Моя проблема в том, как мне сказать клиенту в app.post ()?

app.post("/register", function(req,res){

Должен ли я просто использовать Socket.IO для всего и просто избегать использования POST (я думал, что POST было удобно)?

1 Ответ

1 голос
/ 24 апреля 2020

РЕДАКТИРОВАТЬ

Моя проблема заключается в том, что я хочу, чтобы клиент запускался при появлении сообщения типа «Имя пользователя уже занято» и просто сделал небольшое изменение на ярлыке «Имя пользователя» "вместо того, чтобы писать всю страницу новой.

Хорошо, я думаю, что вижу проблему, с которой вы сталкиваетесь.

Предположим, у вас есть страница на клиенте с <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");
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...