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

标签 javascript mongodb authentication mongoose schema

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

相关文章:

javascript - 如何创建格式化的 javascript 控制台日志消息

javascript - 如何添加关闭按钮以使用 CSS 提醒日志?

mongodb - Playframework + Morphia + MongoDb + ElasticSearch = Disater?

javascript - 创建一个包含 Node.js、MongoDb 和 D3.js 的 Web 应用程序

javascript - PHP中带标签select的操作

mongodb - 如何使用mongodb scala驱动程序在insertOne之后返回mongodb ObjectId _id

authentication - 为什么在 Google API 中对网络应用程序使用 ClientLogin 是一个坏主意?

ios - 使用 API 的开发者 key

reactjs - 如何在 React SPA 的浏览器中保留 Auth0 登录状态

javascript - .Net Core Get 不被击中