NodeJS 为什么我在Express.js中的注销路由无法重定向,如何修复?

au9on6nz  于 2023-06-05  发布在  Node.js
关注(0)|答案(2)|浏览(161)

注销路由不起作用,即使使用另一个路由,也无法呈现或重定向到该路由。但是console.log("am clicked");可以用

const express = require('express')
const app = express()
const path = require('path')
const fs = require('fs')
const port = 7000
const sqlite3 = require("sqlite3").verbose();
const session = require('express-session');
const cookieParser = require('cookie-parser');
const bodyparser = require('body-parser');

let fdata = require('./fashion.json');
fdata = fdata.Sheet1;

app.use(session({
  secret: 'keyboardwarrior',
  resave: false,
  saveUninitialized: true,
  cookie: {
      maxAge: 30 * 60 * 1000 // 30 minutes
  }
}));

app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "views"));
app.use(express.static(path.join(__dirname, "public")));
app.use(express.urlencoded({ extended: false }));
app.use(bodyparser.json());
app.use(cookieParser());

app.get('/', (req, res) => {
  res.render('shop');
})

app.get('/shop', (req, res) => {
  res.render('shop');
})

app.get('/checkout', (req, res) => {
  res.render('checkout')
})

app.get('/fashion', (req, res) => {
res.send(fdata)
})

// Loggedin
app.get('/loggedin', (req, res) => {
  res.render("shop")
})

// Blank
app.get('/blank', (req, res) => {
  res.render("blank")
})

// Register
app.post('/register', async (req, res) => {
  const {firstname, lastname, usermail, password} = req.body; 
  if (!usermail || !password) return res.status(400).send({error: "Email or password missing."});

  db.serialize(() => {
    db.each('SELECT COUNT(*) as count FROM user WHERE email = ?', [usermail], (err, row) => {
      console.log(row)
      if(err) {
        console.log(err.message);
      } else if(row.count > 0) {
        console.log('there is a match');
      } else {
        db.run('INSERT INTO user (fname, lname, email, pass) VALUES(?,?,?,?)', [firstname, lastname, usermail, password], (err) => {
          if (err) {
            return console.log(err.message);
          }
          console.log("User successfully registered.");
        })
      
        res.redirect('/')
      } 
    }); 
  
  });

})

// const isLoggedIn = (req, res, next) => {
//   if(req.session.currentUser){
//       next();
//   }else{
//       res.redirect("/");
//   }
// };

// app.get("/", isLoggedIn, (req, res) => {
//   res.render("/", {currentUser: req.session.currentUser});
// });

app.get('/user/:id', function(req,res){
  const id = req.params.id;

  db.serialize(()=>{
    db.each('SELECT * FROM user WHERE _id = ?', [id], (err, row) => {     
    
      try {
        console.log(`${row._id}`);
        res.send(row);
      }catch (err) { 
        res.status(400).send(err);
      }
    
    })
  })
});

// login
app.post('/', async (req, res) => {
  const {usermail, password} = req.body; 

  db.serialize(()=>{
    db.each('SELECT _id ID, email USEREMAIL, pass USERPASS FROM user WHERE email = ?', [usermail], (err, row) => {     
      if(err){
        return console.error(err.message);
      }else {
       
        try {
          if(row.USEREMAIL && row.USEREMAIL === usermail) {
            console.log(`${row.ID}`);
            req.session.isLoggedIn = true;
            req.session.currentUser = `${row.USEREMAIL}`;
            res.render('shop', {uid: `${row.ID}`});
          }
        } catch (err) { 
            res.status(400).send(err);
        }

      } 
    })
  })
  
})

app.post('/logout', (req, res) => {
console.log("am clicked");
  if (req.session) {
    req.session.destroy();
    console.log('have been clicked');
  }
  return res.render('shop', {uid: ``});
});

const db = new sqlite3.Database('users.db', err => {
  if (err) {
    return console.error(err.message);
  }
  console.log("Successful connection to the database 'users.db'");
});

app.all('*', (req, res) => {
  res.render('404');
})

app.listen(port, () => {
  console.log(`Listening on port ${port}`)
})

我希望它能重新渲染回家的路线

7d7tgy0s

7d7tgy0s1#

通过客户端Javascript代码发出的 AJAX 请求不会自动更改浏览器中的任何内容。它们不会将内容呈现到浏览器中。他们不遵循重定向,并告诉浏览器转到一个新的URL。他们只是返回一个http状态和内容回到你的Javascript。这取决于你的Javascript对发送回来的响应做些什么。
对于您的客户端代码:

logout.addEventListener('click', () => { 
    axios.post('/logout')
      .then(() => { })
      .catch((err) => { console.log(err) }) 
});

这段代码只是向服务器发送一个POST请求,然后对从服务器返回的响应不做任何处理。因此,浏览器完全忽略该响应。不管你在服务器中呈现什么内容并作为响应发送回去,如果你发送回一个重定向响应也没关系,因为你的Javascript代码没有对任何返回的响应做任何事情。
注意,这与<form> POST请求不同。这些响应不涉及您的Javascript,并且浏览器会自动处理响应(重定向或新呈现的内容)。
如果你想让浏览器显示一个新URL的内容,那么你可以让服务器执行一个res.redirect(newURL),你可以让上面的Javascript检查返回的状态,如果它是一个3xx响应,那么它可以将window.location设置为Location头中的任何URL。这样,你的Javascript就会告诉浏览器去一个新的URL,然后它就会这样做。
你可以这样做所有的客户端:

logout.addEventListener('click', () => { 
    axios.post('/logout').then(() => {
           // go back to top level home page after logout
           window.location.href = "/";
    }).catch((err) => { 
         // probably need to tell the end user something here
         console.log(err);
    });
})
zphenhs4

zphenhs42#

要解决此问题,您可以按如下方式修改注销路由:

app.post('/logout', (req, res) => {
  console.log("am clicked");
  if (req.session) {
    req.session.destroy();
    console.log('have been clicked');
  }
  return res.redirect('/shop');
});

相关问题