我正在创建一个 Meme Web 应用程序。我遇到了一个问题,我可以登录,但当我尝试注销时出现 404 错误。 我正在使用带有 EJS 模板引擎的 ExpressJS。
登录.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请求,但没有成功。我只是不断遇到错误。
app.use('/login', Router)
会将 /login
添加到路由器中定义的所有路由中。/logout
,您应该将属性值更改为 /login/logout
,因为您已将后端的注销处理程序与路由 /login/logout
相匹配。虽然有这样的路线真的很令人毛骨悚然/login/logout
。相反,您可以将 app.use('/login', Router)
更改为 app.use('/auth', Router)
,这样您的注销链接 href 将指向 /auth/logout