【问题标题】:Everything is fine but logout doesn't work - (Cannot POST /logout)一切都很好,但注销不起作用 - (无法发布/注销)
【发布时间】:2021-08-09 03:40:47
【问题描述】:

我的注销不起作用,我正在尝试找出原因。

当我点击提交时,它显示:无法 POST /logout

我已使用护照检查用户的数据,并为每个网页创建了路线。

我尝试了很多东西,但我认为问题可能来自动作方面的表单。

感谢您的帮助。

这里是代码:

animator.ejs

<h1>Hi <%= name %></h1>
<form action="logout?_method=DELETE" method="POST">
    <button type="submit">Log Out</button>
</form>

animator.js

const express = require('express')
const router = express.Router()
const passport = require('passport')
require('../passport-config')(passport);

router.get('/', (req, res) =>{
    res.render('animator/animator', {name: req.user.email})
})

router.delete('/logout', (req, res) =>{
    req.logout()
    res.redirect('/login')
})

module.exports = router

server.js

if(process.env.NODE_ENV !== 'production') {
const dotenv = require('dotenv')
dotenv.config();
}

const express = require('express')
const expressLayouts = require('express-ejs-layouts')
const passport = require('passport')
const flash = require('express-flash')
const session = require('express-session')
const dotenv = require('dotenv')

const app = express()

require('./passport-config')(passport);

const indexRouter = require('./routes/index')
const registerRouter = require('./routes/register')
const loginRouter = require('./routes/login')
const parentRouter = require('./routes/parent')
const animatorRouter = require('./routes/animator')

app.set('view engine','ejs')
app.set('views', __dirname + '/views')
app.set('layout', 'layouts/layout')

app.use(expressLayouts)
app.use(express.static('public'))
app.use(express.urlencoded({ extended : false }))
app.use(flash())
app.use(session({
    secret: process.env.SESSION_SECRET,
    resave: false,
    saveUninitialized: false
}))
app.use(passport.initialize())
app.use(passport.session())


const mongoose = require('mongoose');

mongoose.connect(process.env.DATABASE_URL, {
useNewUrlParser: true, useUnifiedTopology: true}).then(()=>{
    console.log('Successfully connected to the mongoDB Atlas!')
}).catch((error)=>{
    console.log('impossible to connect to the mondoDB Atlas !')
    console.error(error);
});

app.use('/', indexRouter)
app.use('/register', registerRouter)
app.use('/login', loginRouter)
app.use('/animator', animatorRouter)
app.use('/parent', parentRouter)


app.listen(process.env.PORT || 3000)

【问题讨论】:

  • 请解释一下你说它不起作用是什么意思?你能指望什么?它会抛出错误吗?
  • 完成 :) 我希望动画师和父页面退出并返回登录页面。

标签: javascript node.js mongoose passport.js


【解决方案1】:

看起来您正在发出 POST 请求,但路由已配置为 DELETE。 您可以更新表单 HTML 以使用 DELETE 方法或为路由配置 POST。

表单更新选项:

<form action="/logout" method="DELETE">

服务器重新配置选项:

router.post('/logout', (req, res) =>{
    req.logout()
    res.redirect('/login')
})
<form action="/logout" method="POST">

【讨论】:

  • 我认为最好从服务器端改为POST
  • 你知道更好的解决方案它不起作用吗?
  • 您能解释一下您看到的错误或问题吗?你还在收到Cannot POST /logout 还是新的东西?
  • 好的,我找到了答案,谢谢你的帮助 :) 在文件 index.js 上我把这段代码:router.post('/logout', (req, res) =&gt; { req.logOut() res.redirect('/login') }) 然后在父和动画师 ejs 页面上,我刚刚写了这段代码@ 987654327@ 并且成功了 :)
  • 不客气!对于以后的问题,我建议您将帮助您的答案标记为已接受。而不是添加您自己的实现并标记您自己的答案。
【解决方案2】:

我确实找到了问题的答案。

感谢您的帮助。

这就是我所做的:

在名为 index.js 的文件上

  router.post('/logout', (req, res) => {
  req.logOut()
  res.redirect('/login')
})

然后在文件 parent.js 和 animator.js I

<h1>Hi <%= name %></h1>
<form action="/logout?_method=DELETE" method="POST">
    <button type="submit">Log Out</button>
</form>

一切都很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 2012-06-19
    • 2018-06-09
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多