Как отобразить сведения о вошедшем в систему пользователе в табличном формате с помощью сеанса в узле js , react js , sql?

#javascript #sql #node.js #reactjs #express

Вопрос:

Это страница просмотра, на которую перенаправляются сведения о пользователе

Всем привет, в настоящее время я работаю над проектом, в котором есть две формы входа в систему и форма сведений о пользователе. Когда пользователь войдет в систему и заполнит форму сведений, после этого он перенаправит его на страницу просмотра ,где он/она может просматривать, редактировать, удалять свою запись. Но при входе пользователя в систему должны быть видны только его записи. В моем случае это извлечение всех записей на странице просмотра. Я использую сеанс в узле js. Я не знаю, что пошло не так.

Код сервера

 const express = require("express");
const app = express();
const cors = require('cors');
const mysql = require("mysql");
const cookie=require("cookie-parser");
const session=require("express-session");
const bodyparser=require("body-parser");
app.use(cors({
    origin:("http://localhost:3000"),
    methods:("GET","POST"),
    credentials:true
}));
app.use(cookie("secret"));
app.use(bodyparser.urlencoded({extended:true}));
app.use(session({
    key:"userid",
    resave:false,
    saveUninitialized:false,
    secret:"userinfo",
    cookie:{
        expires:60*60*24,
    },
}))

app.use(express.json());
const db = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'demo'
});
db.connect((err) => {
    if (err) {
        throw err;
    }
    else {
        console.log("Mysql Connected");
    }
})

//var sess
app.post('/register', (req, res) => {
    const email = req.body.email;
    const password = req.body.password;
    const cpassword = req.body.cpassword;
    db.query("SELECT  FROM registration WHERE email='" email "';", [email], (err, result) => {
        if(result){
            res.send({message:"User already exists"})
        }
        else{
            db.query("INSERT INTO registration (email,password,cpassword) VALUES(?,?,?)", [email, password, cpassword], (err, result) => {
               if(err){
                   res.send(err);
               }
               else{
                   res.send({message:"Registered Successful"})
               }
            })
        }
    })

    
})

app.post("/login", (req, res) => {
    const email = req.body.email;
    const password = req.body.password;
    db.query("SELECT * FROM registration WHERE  email='" email "' AND password='" password "';", [email,password], (err, result) => {
        if(err){
            res.send({err:err});

        }
        if(result.length>0){
              req.session.user=resu<
              console.log( req.session.user)
              res.send(result);
            // sess=req.session;
            // sess.userid=req.body.email;
            //  console.log(req.session)
             
        else{
            res.send({message:"Wrong username/passsword"})
        }
    })
     app.get("/login",(req,res)=>{
         if(req.session.user){
             res.send({loggedIn:true,user:req.session.user})
            
         }
         else{
             res.send({loggedIn:false});
     
     }
 })
 app.post('/add', (req, res) => {
        const firstname=req.body.firstname;
        const lastname=req.body.lastname;
        const email=req.body.email;
        const mobile=req.body.mobile;
        const address=req.body.address;
        const city=req.body.city;
        const pincode=req.body.pincode;
        const conference=req.body.conference;
        const seminar=req.body.seminar;
        const paper=req.body.paper;
        //const user_id=req.body.user_id;
       
        if(firstname==""||lastname==""||email==""||mobile==""||address==""||city==""||pincode==""||conference==""||seminar==""||paper=="")
        {
            return res.status(422).json({error:"Please Fill the form correctly"});
    
        }
        
           
        db.query("INSERT INTO teacher  (firstname,lastname,email,mobile,address,city,pincode,conference,seminar,paper) VALUES(?,?,?,?,?,?,?,?,?,?)", [firstname,lastname,email,mobile,address,city,pincode,conference,seminar,paper], (err, result) => {
             console.log(err)   
            
        //    if(result){
        //     //sess=req.session;
        //     req.session.user=resu<
        //     console.log(req.session.user)
        //     res.send(result)
            //sess.email=req.body.email;
            //if(sess.email){
            //console.log( sess)
            //res.send(result)
            //res.redirect("/view");
           
            //}
           
          // }   
        //   else{
        //       res.send(err)
        //  }
           
        })
            
        
    })
    

        
            
//  })
//   
 app.get("/teachersdata" , (req, res) => {
     
     db.query("SELECT * FROM teacher ",(err,result)=>{
          if(result){
        
          res.send(result);
        
           }
            
    
        
        
     
    
        
 })
 app.get("/teachersdata/:id", (req, res) => {

      db.query('SELECT * FROM teacher WHERE id=?',[req.params.id], (err, result)=>{
          if(err){
              console.log('Error while fetching employee by id', err);
             
          }else{
              res.send(result)
          }
      })
    
        
 })
    app.get("/logout",(req,res)=>{
        console.log("logout page");
        //req.logout()
        console.log( req.session.user)
        res.clearCookie("user")
        //res.redirect("/login")
        req.session.destroy((err) => {
            res.redirect('/login') // will always fire after session is destroyed
          })

    })

})
app.put('/edit/:id',(req,res)=>{
    const firstname=req.body.firstname;
    const lastname=req.body.lastname;
    const email=req.body.email;
    const mobile=req.body.mobile;
    const address=req.body.address;
    const city=req.body.city;
    const pincode=req.body.pincode;
    const conference=req.body.conference;
    const seminar=req.body.seminar;
    const paper=req.body.paper;
    const id=req.params.id;
    db.query("UPDATE teacher SET firstname=?,lastname=?,mobile=?,email=?,address=?,city=?,pincode=?,conference=?,seminar=?,paper=? WHERE id=?",[id,firstname,lastname,email,mobile,address,city,pincode,conference,seminar,paper],(err,res)=>{
        if(err){
            console.log(err)
        }
        else{
            res.send(res);
        }
    })
})
app.delete("/delete/:id",(req,res)=>{
    db.query("DELETE FROM teacher WHERE id=?",[req.params.id],(result,err)=>{
        if(err){
            res.send(err)
        }
        else{
            res.send(result)
        }
    })
})
app.listen(3001)
 

Это код реакции

 import React from 'react';
import axios from 'axios';
import { useState,useEffect } from 'react';
import { Link } from 'react-router-dom';

export const View = () => {
   const [teacherList, setteacherList] = useState([]);
   
  useEffect(() => {
    loadUsers();
  }, [])
  const loadUsers= async()=>{
    const result =await axios.get("http://localhost:3001/teachersdata");
    console.log(result)
    setteacherList(result.data)
  }
 
  


const deleteUser = async id => {
  await axios.delete(`/delete/${id}`);
  loadUsers();
};

 
  return (
    <div>
       
      <table class="table">
  <thead class="thead-dark">
    <tr>
      <th scope="col">#</th>
      <th scope="col">FirstName</th>
      <th scope="col">LastName</th>
      <th scope="col">Email</th>
      <th>Action</th>
    </tr>
  </thead>
  <tbody>
    {
      teacherList.map((user,index)=>(
        <tr>
          <th scope="row">{index 1}</th>
          <td>{user.firstname}</td>
          <td>{user.lastname}</td>
          <td>{user.email}</td>
          <td>
           
            <Link class="btn btn-primary me-md-2" to={`/teachersdata/${user.id}`}>View</Link>
            <Link class="btn btn-outline-primary me-md-2" to={`/edit/${user.id}`}>Edit</Link>
            <Link class="btn btn-danger" onClick={() => deleteUser(user.id)}>Delete</Link>
            
          </td>
          </tr>
         
      ))}
    
  </tbody>
</table>
    </div>

  )

}
 

login page (client)

 import React from 'react'
import { useState } from 'react';
import axios from 'axios';
import {useHistory} from 'react-router-dom';

const Login = () => {
    axios.defaults.withCredentials=true;
    const history=useHistory();
    const [emailreg,setemail]=useState('');
    const [passreg,setpass]=useState('');
    
    const login=()=>{
        
        axios.post("/login",{
            email:emailreg,
            password:passreg,

        }).then((res)=>{
            //alert(res.data.message)
            //setLoginUser(res.data.user)
            //history.push("/add")
              //console.log(res);
             if(res.data.message){
                  alert(res.data.message);
              }
              else{
                 alert("Login Sucessfully");
                  history.push("/add")
          }
            
        })
        
        
    }
    

    return (
    
            <div className="login">
            <h1>Login</h1>
            <label>Email ID</label>
            <input type="text" onChange={(e)=>{
                setemail(e.target.value);
            }}/><br/>
            <label>Password</label>
            <input type="password" onChange={(e)=>{
                setpass(e.target.value);
            }}/><br/>
            <button onClick={login}>Login</button>
            
            
        </div>
        
        
    )
}

export default Login
 

Страница сведений о пользователе

 import { useState } from 'react'
import axios from 'axios';
import {useHistory} from 'react-router-dom';
import { useEffect } from 'react';
const Main = () => {
  const [formStep, setFormStep] = useState(0);
  const history=useHistory();

   
    const [firstname,setfirstname]=useState('');
    const [lastname,setlastname]=useState('');
    const [email,setemail]=useState('');
    const [mobile,setmobile]=useState('');
    const [address,setaddress]=useState('');
    const [city,setcity]=useState('');
    const [pincode,setpincode]=useState('');
    const [conference,setconference]=useState('');
    const [seminar,setseminar]=useState('');
    const [paper,setpaper]=useState('');
    const [loginstatus,setlogin]=useState('');
    //const [userid,setuserid]=useState('');

  const completeFormStep = () => {
    setFormStep(step => step   1)
  }
  const backFormStep = () => {
    setFormStep(step => step - 1)
  }
  
  const handlesubmit = () => {
    axios.post("http://localhost:3001/add",{
            firstname:firstname,
            lastname:lastname,
            email:email,
            mobile:mobile,
            address:address,
            city:city,
            pincode:pincode,
            conference:conference,
            seminar:seminar,
            paper:paper,
            //userid:userid

           

        }).then((res)=>{
            console.log("success");
           
           
            
           
           
            
        })
        

        history.push("/view")

        
  };
  
    useEffect(() => {
      axios.get("/login").then((res)=>{
          console.log(res)
          if(res.data.loggedIn===true){
          setlogin(res.data.user[0].email)
          // if(res.data.loggedIn===true){
          // setlogin(res.data.userid)
         }
      })
  }, []);

  
  return (
    <div className="create">
      <form method="POST">
        {formStep === 0 amp;amp; (
          <section>
             <h1>{"Welcome"   loginstatus}</h1> 
            <h2>Names</h2>

            <label>First Name</label>
            <input
              type="text"
              required
              onChange={(e)=>{
                setfirstname(e.target.value);
            }}
              

            />


            <br />

            <label>Last Name</label>
            <input
              type="text"
              required
              onChange={(e)=>{
                setlastname(e.target.value);
            }}

            />

            <br />
            <button type="button" onClick={completeFormStep}>Next</button>
          </section>)}

        <div className="step2">
          {formStep === 1 amp;amp; (
            <section>
              <h2>Contact</h2>

              <label>Email ID</label>
              <input
                type="email"
                required
                onChange={(e)=>{
                  setemail(e.target.value);
              }}

              />
              <br />
              {/* <label>UserID</label>
              <input
                type="userid"
                required
                onChange={(e)=>{
                  setuserid(e.target.value);
              }}
              />
              <br/>  */}
              <label>Mobile No.</label>
              <input
                type="text"
                required
                onChange={(e)=>{
                  setmobile(e.target.value);
              }}

              />
              <br />
              <button type="button" onClick={backFormStep}>Back</button>
              <button type="button" onClick={completeFormStep}>Next</button>
            </section>)}
        </div>

        <div className="step3">
          {formStep === 2 amp;amp; (
            <section>
              <h2>Address</h2>
              <label>Address</label>
              <textarea onChange={(e)=>{
                setaddress(e.target.value);
            }}>

              </textarea>
              <br />

              <label>City</label>
              <input
                type="text"
                required
                onChange={(e)=>{
                  setcity(e.target.value);
              }}
              />
              <br />
              <label>Pincode</label>
              <input
                type="text"
                required
                onChange={(e)=>{
                  setpincode(e.target.value);
              }}

              />
              <br />
              <button type="button" onClick={backFormStep}>Back</button>
              <button type="button" onClick={completeFormStep}>Next</button>

            </section>)}
        </div>
        <div className="step4">
          {formStep === 3 amp;amp; (
            <section>
              <h2>Conferences attended,seminar and paper presented</h2>

              <label>Conferences name</label>
              <textarea placeholder="conferences names" onChange={(e)=>{
                setconference(e.target.value);
            }}></textarea>

              <br />
              <label>Seminar attended</label>
              <textarea placeholder="seminar names"onChange={(e)=>{
                setseminar(e.target.value);
            }}></textarea>

              <br />
              <label>Paper presented</label>
              <textarea placeholder="paper names" onChange={(e)=>{
                setpaper(e.target.value);
            }}></textarea>
              <br />
              <button type="button" onClick={backFormStep}>Back</button>
              <button type="submit" onClick={handlesubmit}>Submit</button>
             
            </section>)}
          <div>


          
          </div>
         

        </div>




      </form>










    </div>
  );
}

export default Main
 

Я хочу, чтобы при входе пользователя в систему и заполнении формы сведений отображались только его данные или данные вошедшего пользователя, каждый пользователь должен получить свои собственные данные на странице просмотра после входа в систему. Я новичок в node js и реагирую.

Заранее спасибо

Комментарии:

1. Где ваша логика входа в систему на стороне клиента?

2. @SanishJoseph Я отредактировал свой пост прямо сейчас

3. После входа в систему вы просто переходите к add маршруту, который, как я предполагаю, указывает на Main компонент, и нет никакой логики, чтобы увидеть, вошел ли пользователь в этот компонент. На экране входа в систему вы ничего не делаете с получаемым ответом. Я добавлю отдых в качестве ответа.

Ответ №1:

Я вижу, что вы отправляете {loggedIn:true,user:req.session.user} сообщение после входа в систему, но ваше клиентское приложение теперь игнорирует его. Что вы можете сделать, так это сохранить этот объект, полученный после входа в локальное хранилище, чтобы, даже если они обновят страницу, у нас был доступ к объекту.

После сохранения объекта в локальном хранилище в вашем Main компоненте вам необходимо проверить, существует ли объект в локальном хранилище, loggedIn имеет ли значение true и user срок действия объекта сеанса не истек. Если какое-либо из этих условий не выполнено, вам необходимо очистить локальное хранилище и перенаправить пользователя на страницу входа в систему.

Я не уверен, истек ли у вас срок действия сеанса в user объекте, но у вас наверняка должен быть файл cookie с истекшим сроком действия.

Я надеюсь, что это ясно.

Комментарии:

1. Да, я постараюсь, Большое вам спасибо