首页 > 解决方案 > 登录无法从 req.body 获取值,导致无法读取未定义的属性“密码”的问题

问题描述

希望有人可以帮助我,请我无法从 login.hbs 中的表单中获取 req.body 的值,并报告错误:无法读取未定义的属性“密码”。

我已经搜索了很长时间,但仍然无法修复它。

我还有另外一个页面叫做register.hbs,格式和login.hs类似,其他部分也差不多,但是register里面的form可以发布信息,可以通过req.body获取,但是这部分就不一样了关于登录。

像这样的控制台报告:[对象:空原型] {帐户:'11@gmail.com',密码:'1234qQ'}未定义未定义[](节点:20204)UnhandledPromiseRejectionWarning:TypeError:无法读取属性

(节点:20204)[DEP0018] DeprecationWarning:未处理的承诺拒绝将终止 Node.js 进程并使用非零退出代码。

//login.js
function signupbutton(){
    parent.location.href="/register";
}

function validate(){
    var username=document.getElementById('usr');
    var password=document.getElementById('pwd');
    //username and password cannot be empty
    if(username.value.trim()==""){
        alert("please fill in your account");
        username.style.border = "solid 2px blue";
        return false;
    }
    else if(password.value.trim()==""){
        alert("please enter your password");
        password.style.border = "solid 2px blue";
        return false;
    }
    else{
        //check database
       
        return auth.js;
        
    }
}


//auth.js
exports.login = async (req,res) =>{
        console.log(req.body);
        const{mail, Password} = req.body;
        
        console.log(mail);
        console.log(Password);

        db.query('SELECT * FROM users WHERE emailaddress=? ',[mail],async(error,results)=>{
          
            console.log(results);
            
            if(error){
                console.log(error); 
            }
            if(!results || !(await bcrypt.compare(Password, results[0].password)) ){
                res.status(400).render('login',{
                    message: 'Email or password is incorrect'
                })
            }
            else {
                
                const id = results[0].id;
                const token = jwt.sign({ id:id }, process.env.JWT_SECRET,{
                    expiresIn: process.env.JWT_EXPIRES_IN
                });

                console.log("The token is: " + token);

                const cookieOptions = {
                    expires: new Date(
                        Date.now() + process.env.JWT_COOKIE_EXPIRES * 24 * 60 * 60 * 1000
                    ),
                    httpOnly: true
                }

                res.cookie('jwt',token,cookieOptions);
                res.status(200),redirect("/register");
            } 
       
        });
        

    
}


//app.js
const express = require("express");
const path = require("path");
const mysql = require("mysql");
const dotenv = require("dotenv");
const cookieParser = require ("cookie-parser");

dotenv.config({
    path: './.env'
});

const app = express();

const db = mysql.createConnection({
    host: process.env.DATABASE_HOST, 
    user: process.env.DATABASE_USER,
    password: process.env.DATABASE_PASSWORD,
    database: process.env.DATABASE
    //online server, local host just about where the database is
});

const publicDirectory = path.join(__dirname, './public'); 
app.use(express.static(publicDirectory));

//grab the data
app.use(express.urlencoded({ extended:false }));

app.use(express.json());
app.use(cookieParser());

app.set('view engine','hbs');

db.connect((error)=>{
    if(error){
        console.log(error)
    }
    else{
        console.log("mysql connected...")
    }
});


app.use('/', require('./routes/pages'));    

app.use('/auth',require('./routes/auth'));   

app.listen(5001, ()=>{
    console.log("Server started on Port 5001");
})


//route.js
const express = require('express');
const authController = require('../controllers/auth');


const router = express.Router();

router.post('/login',authController.login);
router.post('/register', authController.register);



module.exports = router;


//pages.js
const express = require('express');

const router = express.Router();



router.get('/register',(req,res)=>{
    res.render('register');
}); 

router.get('/login',(req,res)=>{
    res.render('login');
});

module.exports = router;
<!DOCTYPE html>
<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="x-UA-Compatible" content="ie=edge">
        
        <link rel="stylesheet" href="/style.css"/>
        <title>Voting Platform</title>
        <link ref="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css"/>
        <script src="/js/login.js" type="text/javascript" charset="utf-8"></script>
</head>

<body>
        <div class="login1">
         <div class="thesignform">
   
          <form onsubmit=" validate(); return false;" action="/auth/login" method="POST" class="login" id="login"> 
            <h1>Log in</h1>
            <img class="iconp" src="/img/icon"}}
            </div>
        </div>


</body> 
 
</html>

标签: javascripthtmlmysqlnode.js

解决方案


推荐阅读