我正在尝试使用 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/