客户端(浏览器)POST了用户名、密码、邮箱等值......我的NodeJS应用接收到这些值后,现在需要先检查usernameemail是否已经在数据库中使用,如果是,则回复客户端 "用户名已经被占用"。
我的问题是如何在app.post()中告诉客户端?
app.post("/register", function(req,res){
我是否应该在所有的事情上都使用Socket.IO,避免使用POST(我认为POST很方便)?
编辑
我的问题是,我想让客户端在收到 "用户名已被占用 "这样的消息时被触发,然后只需在 "用户名已被占用 "的标签上做一个小改动,而不是把整个页面都写成新的。
好吧,我想我明白你所面临的问题了。
假设你在客户端的页面上有一个带有 "用户名 "的页面。<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");
});