javascript 如何在节点应用中间件中正确的给予next()

ftf50wuq  于 2023-01-11  发布在  Java
关注(0)|答案(2)|浏览(108)

我正在尝试验证在登录请求后生成的不记名令牌。我已将控制器、中间件和路由的代码分开。登录运行正常,能够生成令牌,但当我尝试验证它时,收到以下错误:

Error: Route.post() requires a callback function but got a [object Undefined]        
    at Route.<computed> [as post] (C:\Users\Desktop\loginapi\node_modules\express\lib\router\route.js:211:15)
    at Function.proto.<computed> [as post] (C:\UsersDesktop\loginapi\    at Module.require (node:internal/modules/cjs/loader:1028:19)
    at require (node:internal/modules/cjs/helpers:102:18)    at Object.<anonymous> (C:\Users\Desktop\loginapi\index.js:15:20)  
[nodemon] app crashed - waiting for file changes before starting...

下面是完整的代码:
服务器. js//主文件

const express = require('express')
const app = express()
require('dotenv').config();

const port = process.env.PORT;

console.log(port)

//initialize middleware
app.use(express.json())

//import routes
const authRoutes = require('./src/routes')

// initialize routes
app.use('/abc', authRoutes)

// console.log();

//app start
const appStart = () => {
    try {
        app.listen(port, ()=> {
            console.log(`The app is listening at http://localhost:${port}`)
        })
    } catch (error) {
        console.log(`${error.message}`)
    }
}

appStart()

路由/索引/js

const { Router} =  require('express')
const userController = require('../controllers/index')
const { verifyToken } = require('../middlewares/verifyTokens')
const router = Router()

router.post('/login', userController.login)
router.post('/profile',verifyToken ,userController.profile)

module.exports = router

middlewares/verifyTokens.js

// Function to verify whether the bearer token is correct or not
function verifyToken(req, resp, next) {
    const bearerHeader = req.headers['authorization'];
    if (typeof bearerHeader !== 'undefined') {
        const bearer = bearerHeader.split(" ");
        const token = bearer[1];
        req.token = token;
        next();
    } else {
        resp.send({
            result: 'Invalid Token'

        })
    }
}

module.exports = verifyToken

contollers/index.js

const { sign } = require('jsonwebtoken')
const secret = process.env.SECRET;

//login function
const login = async (req, res) => {
  payload = {
    "email": "abc@gmail.com",
    "password": "user123"
  }
  console.log(payload)
  try {
    sign(payload, secret, (err, token) => {
      try {
        res.json({
          token
        })
        // console.log(typeof resp.json)

      } catch (err) {
        res.send(err.message);
      }
    })
  } catch (error) {
    console.log(error.message)
    return res.status(500).json({
      error: error.message
    })
  }
}

const profile = async (req,res) => {
  try {
    return res.status(200).json({
      success: true,
      message: 'In Profile',
    })

  } catch (error) {
    console.log(error.message)
    return res.status(500).json({
      error: error.message
    })
  }
}

const userControllers = {
  login,
  profile
}

module.exports = userControllers

中间件verifyTokens有一些问题,我已经看过其他答案,但我没有得到它。有人能指出我哪里出错了吗?这将是非常有帮助的。谢谢

nzk0hqpo

nzk0hqpo1#

导入不带{ }的verifyToken将解决此问题。
在路径/索引/js中:

const verifyTokens = require('../middlewares/verifyTokens')
f2uvfpb9

f2uvfpb92#

而不是这个

router.post('/login', userController.login)
router.post('/profile',verifyToken ,userController.profile)

试试这个

router.post('/login',(req, res) => {
  userController.login
});

router.post('/profile', 
 (req, res, next) => {
   verifyToken
 }, 
 (req,res,next) => {
   userController.profile
 }
);

相关问题