NodeJS使用Socket.IO对POST的响应

问题描述 投票:0回答:1

客户端(浏览器)POST了用户名、密码、邮箱等值......我的NodeJS应用接收到这些值后,现在需要先检查usernameemail是否已经在数据库中使用,如果是,则回复客户端 "用户名已经被占用"。

我的问题是如何在app.post()中告诉客户端?

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

我是否应该在所有的事情上都使用Socket.IO,避免使用POST(我认为POST很方便)?

node.js post socket.io
1个回答
1
投票

编辑

我的问题是,我想让客户端在收到 "用户名已被占用 "这样的消息时被触发,然后只需在 "用户名已被占用 "的标签上做一个小改动,而不是把整个页面都写成新的。

好吧,我想我明白你所面临的问题了。

假设你在客户端的页面上有一个带有 "用户名 "的页面。<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 请求,重定向用户的页面。

如果我没有理解错的话,你想发送这个请求。 被重定向的用户。

如果确实是这样,我会使用 取来 或类似的东西)来完成这项工作。

所以在客户的页面上,你会做这样的事情。

首先,在你的表单中添加这个道具

...
<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(REST API)的功能不同,各自可以帮助解决不同的问题。

对于你概述的那种情况,我会继续使用REST API。

我建议你阅读一下关于 快递 以及如何发送 回应.

这里有一些伪代码,希望能给你指明正确的方向。

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");
});
© www.soinside.com 2019 - 2024. All rights reserved.