【问题标题】:req.next is not a function [CLOSE]req.next 不是函数 [关闭]
【发布时间】:2021-11-04 10:19:39
【问题描述】:

我正在做一个网站。我在仪表板阶段遇到问题,因为我收到错误 TypeError: req.next is not a function。我想做一个仪表板子页面。我正在使用 isAuthorized 函数来检查用户是否已登录。 请帮忙。

C:\Users\olios\Desktop\Moje rzeczy\Avi\Boty\Auth\node_modules\mysql\lib\protocol\Parser.js:437
      throw err; // Rethrow non-MySQL errors
      ^

TypeError: req.next is not a function
    at done (C:\Users\olios\Desktop\Moje rzeczy\Avi\Boty\Auth\node_modules\express\lib\response.js:1007:25)
    at tryRender (C:\Users\olios\Desktop\Moje rzeczy\Avi\Boty\Auth\node_modules\express\lib\application.js:642:5)
    at Function.render (C:\Users\olios\Desktop\Moje rzeczy\Avi\Boty\Auth\node_modules\express\lib\application.js:592:3)
    at ServerResponse.render (C:\Users\olios\Desktop\Moje rzeczy\Avi\Boty\Auth\node_modules\express\lib\response.js:1012:7)
    at C:\Users\olios\Desktop\Moje rzeczy\Avi\Boty\Auth\src\routes\dashboard.js:31:21
    at Query.<anonymous> (C:\Users\olios\Desktop\Moje rzeczy\Avi\Boty\Auth\src\database\database.js:35:9)
    at Query.<anonymous> (C:\Users\olios\Desktop\Moje rzeczy\Avi\Boty\Auth\node_modules\mysql\lib\Connection.js:526:10)
    at Query._callback (C:\Users\olios\Desktop\Moje rzeczy\Avi\Boty\Auth\node_modules\mysql\lib\Connection.js:488:16)
    at Query.Sequence.end (C:\Users\olios\Desktop\Moje rzeczy\Avi\Boty\Auth\node_modules\mysql\lib\protocol\sequences\Sequence.js:83:24)
    at Query._handleFinalResultPacket (C:\Users\olios\Desktop\Moje rzeczy\Avi\Boty\Auth\node_modules\mysql\lib\protocol\sequences\Query.js:149:8)
[nodemon] app crashed - waiting for file changes before starting...


dashboard.js

const router = require('express').Router()
const database = require('./../database/database')
const fs = require('fs')

const dirAdmin = __dirname + `./../public/config/admin.yaml`

let data

data = JSON.parse(fs.readFileSync(dirAdmin))

function isAuthorized(req, res, next){
    if(req.user){
        next()
    }else{
        res.redirect('/auth')
    }
}

router.get('/', isAuthorized, (req, res) => {

    database.sql("SELECT * FROM servers", (rows) => {
        for(const f of data){
            if(f == req.user.id){
                res.render('dashboard/dashboard', {
                    guilds: req.user.guilds,
                    servers: rows,
                    user: req.user,
                    admin: true
                })
            }else{
                res.render('dashboard/dashboard', {
                    guilds: req.user.guilds,
                    servers: rows,
                    user: req.user,
                    admin: false
                }) 
            }
        }
        
    })
})

router.get('/admin', isAuthorized, (req, res) => {
    database.sql("SELECT * FROM servers", (rows) => {
        for(const f of data){
            if(f == req.user.id){
                res.render('admin/admin', {
                    guilds: req.user.guilds,
                    servers: rows,
                    user: req.user,
                    admin: true
                })
            }else{
                res.render('admin/admin', {
                    guilds: req.user.guilds,
                    servers: rows,
                    user: req.user,
                    admin: false
                }) 
            }
        }
        
    })
})

module.exports = router

auth.js

const router = require('express').Router()
const passport = require('passport')

router.get('/', passport.authenticate('discord'))
router.get('/redirect', passport.authenticate('discord', {
    failureRedirect: '/',
    successRedirect: '/dashboard'
}), (req, res) => {
    res.send(200)
})

router.get('/logout', (req, res) => {
    if(req.user){
        req.logOut()
        res.redirect('/')
    }else{
        res.redirect('/')
    }
})

module.exports = router

discordStretegy.js

const DiscordStrategy = require('passport-discord').Strategy
const passport = require('passport')
const { User } = require('./../database/database')

passport.serializeUser((user, done) => {
    console.log("Serialize")
    done(null, user.id)
})

passport.deserializeUser(async (id, done) => {
    console.log("Deserializing")
    const user = await User.findOne({
        where: {
            id: id
        }
    })

    if(user){
        done(null, user)
    }
})

passport.use(new DiscordStrategy({
    clientID: process.env.CLIENT_ID,
    clientSecret: process.env.CLIENT_SECRET,
    callbackURL: process.env.CLIENT_REDIRECT,
    scope: ['identify', 'email', 'guilds'],
}, async (accessToken, refreshToken, profile, done) => {

    try{

        const user = await User.findOne({
            where: {
                id: profile.id
            }
        })

        if(user){
            console.log("User exists.")
            done(null, user)
        }else{
            console.log("Create new user.")
            const newUser = await User.create({
                id: profile.id,
                username: profile.username,
                avatar: profile.avatar,
                discriminator: profile.discriminator,
                locale: profile.locale,
                email: profile.email,
                guilds: profile.guilds
            })
            done(null, newUser)
        }

    }catch(err){
        console.log(err)
        done(null)
    }
}))

【问题讨论】:

  • 请分享您创建身份验证策略的文件内容
  • 你将不得不做 return res.redirect('/auth') 并且因为如果你不返回任何东西,中间件需要 next() 去下一个处理程序
  • @SachinAnanthakumar 仍然无法正常工作
  • 您的代码中没有req.next。您保存更改了吗?
  • 你是否在客户端的 html 中以某种方式使用它?

标签: javascript node.js express passport.js


【解决方案1】:

你可以简单地改变你的代码:

if(!req.user){
 res.redirect('/auth')
}

【讨论】:

  • 这不是一个好的解决方案。没有next()函数,授权后页面不变
猜你喜欢
  • 2021-04-28
  • 2019-10-26
  • 2020-04-02
  • 2019-01-22
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
相关资源
最近更新 更多