为什么我在尝试注销时遇到错误?

问题描述 投票:0回答:1

我正在创建一个 Meme Web 应用程序。我遇到了一个问题,我可以登录,但当我尝试注销时出现 404 错误。 我正在使用带有 EJS 模板引擎的 ExpressJS。

error message

登录.js

var express = require('express');
var router = express.Router();
const fs = require("fs");
const path = require("path");
var passport = require('passport');
var LocalStrategy = require('passport-local');

passport.serializeUser(function(user, cb) {
    process.nextTick(function() {
        cb(null, { id: user.id, username: user.username });
    });
});

passport.deserializeUser(function(user, cb) {
    process.nextTick(function() {
        return cb(null, user);
    });
});

passport.use(new LocalStrategy(function verify(username, password, cb) {
    let usersArray = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../data/users.json')));
    let filteredArray = usersArray.filter(x => x.username === username);
    if (filteredArray.length > 0) {
        let usersData = filteredArray[0];
        if (usersData.password === password) {
            return cb(null, usersData);
        }
    } else {
        return cb(null, false, { message: 'Incorrect username or password' });
    }
}));

router.post('/password', passport.authenticate('local', {
    successRedirect: '/memes',
    failureRedirect: '/login',
    failureFlash: true  // Add this line for flash messages
}));

router.get('/', function(req, res, next) {
    if(!req.user) {
        res.render('login', {user: null})
    } else {
        res.render('login', {user: req.user});
    }
});

router.post('/logout', function(req, res, next) {
    req.logout(function(err) {
        if (err) { return next(err); }
        res.redirect('/login')
    });
});

module.exports = router;

app.js

const createError = require('http-errors');
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
var passport = require('passport')
var session = require('express-session');
var JsonStore = require('express-session-json')(session);

const memesDataModule = require('./memesData');
const indexRouter = require('./routes/index');
const memesRouter = require('./routes/memes');
const memeDetailsRouter = require('./routes/memeDetails');
var loginRouter = require('./routes/login');

const app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'company logo')));
app.use(express.static(__dirname + '/node_modules/bootstrap/dist'));
app.use(express.static(__dirname + '/node_modules/jquery/dist'));
app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: false,
  store: new JsonStore()
}));
app.use(passport.authenticate('session'));


app.use('/', indexRouter);
app.use('/memes', memesRouter);
app.use('/memesdetails', memeDetailsRouter);
app.use('/login', loginRouter);


// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

我尝试添加注销的get请求,但没有成功。我只是不断遇到错误。

node.js express backend ejs
1个回答
0
投票

app.use('/login', Router)
会将
/login
添加到路由器中定义的所有路由中。
如果网页中注销链接的 href 属性指向
/logout
,您应该将属性值更改为
/login/logout
,因为您已将后端的注销处理程序与路由
/login/logout
相匹配。虽然有这样的路线真的很令人毛骨悚然
/login/logout
。相反,您可以将
app.use('/login', Router)
更改为
app.use('/auth', Router)
,这样您的注销链接 href 将指向
/auth/logout

© www.soinside.com 2019 - 2024. All rights reserved.