gpt4 book ai didi

javascript - 为什么服务器在发布身份验证信息时说需要 "name"?

转载 作者:行者123 更新时间:2023-11-28 03:17:38 24 4
gpt4 key购买 nike

我正在尝试使用 jwt 设置非常基本的身份验证。我可以将信息直接上传到 postman 中的 mongodb 集群,但我在尝试在前端发生同样的事情时遇到了真正的困难。

当我进入本地主机上的“/register”时,输入信息并按提交,它会响应“姓名”为必填项

我很困惑,因为我以为我已经在输入文本框中提交了名称。这是我的架构:

const mongoose = require("mongoose");
const userSchema = new mongoose.Schema({
name:{
type:String,
required:true,
max:300,
min:6
},
email:{
type:String,
required:true,
max:255,
min:6
},
password:{
type:String,
required:true,
max:1024,
min:6
},
date:{
type:Date,
default:Date.now
}
});

module.exports = mongoose.model('User',userSchema);

这是我的 index.js 中的发布过程

app.post('/register',async(req,res)=>{

//Validation
const{error} = registerValidation(req.body);
if(error) return res.status(400).send(error.details[0].message);

//If user already in db
const emailExist = await User.findOne({email:req.body.email});
if(emailExist) return res.status(400).send('Email already exists');

//Salt generation
const salt = await bcrypt.genSalt(10);
const hashPassword = await bcrypt.hash(req.body.password,salt);

//Create User
const u = new User({
name:req.body.name,
email:req.body.email,
password:hashPassword
});
try{
const savedUser = await u.save();
res.send(savedUser);
//If want to send just id:
//res.send({user:user._id});
}catch(err){
res.status(400).send(err);
}
});

//LOGIN:
app.post('/login',async(req,res)=>{

//Validation
const{error} = loginValidation(req.body);
if(error) return res.status(400).send(error.details[0].message);

//If user already in db
const u = await User.findOne({email:req.body.email});
if(!u) return res.status(400).send("Email is wrong");

//Password check
const user_password = u.password;
const password_history = req.body.password;
if(user_password != password_history) return res.status(400).send("Password is wrong");

//JWT
const token = jwt.sign({_id:u._id},process.env.TOKEN_SECRET);
res.header('token',token).send(token);

});

最后是注册表单,register.ejs

<h1>Register</h1>
<form action="/register" method="POST">
<div>
<label for="name">Name</label>
<input type="text" id="name" name="name" >
</div>
<div>
<label for="email">Email</label>
<input type="email" id="email" name="email" >
</div>
<div>
<label for="password">Password</label>
<input type="password" id="password" name="password" >
</div>
<button type="submit">Register</button>
</form>
<a href="/login">Login</a>

我很困惑为什么服务器声明“name”是必需的。我的理解是,提交按钮将“/register”发送到 app.post() 中,然后根据架构请求名称、电子邮件和密码。我认为 name:req.body.name 是作为注册用户时使用的名称输入的名称。有人可以解释一下为什么我错了吗?

为了了解更多背景信息,我将整个项目放在 plunkr 上:https://plnkr.co/edit/kd1kI4fZGGJnmarSh0pq?p=catalogue

最佳答案

我明白了。问题是我提交的是 json 数据,而不是表单数据。我解决这个问题的方法是 import body-parser,删除 app.use(express.json()); 行,并将其替换为 app .use(bodyParser.urlencoded({ 扩展: false }))。我检查了我的 mongo 集群,发现用户已注册到数据库中。

关于javascript - 为什么服务器在发布身份验证信息时说需要 "name"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59495458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com