【问题标题】:Express middleware undefined typeExpress 中间件未定义类型
【发布时间】:2022-02-15 13:44:35
【问题描述】:

我正在尝试为我的 express 服务器创建一个身份验证中间件,但在我的 IDE 中没有收到任何类型错误,但是当我尝试编译时,我收到了TypeError: Cannot read properties of undefined (reading protect)。该路由在没有中间件的情况下工作正常,并且中间件没有可检测到的 linting 问题。我也在使用socket.io,所以我尝试了io.use(wrap(middleware)),它可能会起作用,但它没有,但无论如何这都是在黑暗中拍摄的,这个问题似乎无关紧要。我也尝试用any 替换所有相关的类型声明并遇到了同样的问题。

用户控制器:

export const getMe = asyncHandler(async (req: IGetUserAuthInfoRequest, res: Response): Promise<void> => {
  res.status(200).json(req.user)
})

路由控制器:

public static protect = asyncHandler(async (req: IGetUserAuthInfoRequest, res: Response, next: NextFunction): Promise<void> => {
    let token: string

    if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) {
      try {
        token = req.headers.authorization.split(' ')[1]

        const decoded: JwtPayload = jwt.verify(token, process.env.JWT_SECRET, { complete: true })
        req.user = await UserModel.findById(decoded.id).select('-password')
        next()
      } catch (err) {
        res.status(401)
        throw new Error('Not authorised')
      }
    }
    if (!token) {
      res.status(401)
      throw new Error('Not a valid token')
    }
  })

扩展快递请求接口:

export interface IGetUserAuthInfoRequest extends Request {
  user: any
}

用户路由器:

userRouter.route('/me').get(RoutesController.protect, userController.getMe)

错误:

TypeError: Cannot read properties of undefined (reading 'protect')
    at Object.<anonymous> (C:\Users\liams\dev\my-rest-server\src\routes\user.router.ts:8:46)
    at Module._compile (node:internal/modules/cjs/loader:1097:14)
    at Module._compile (C:\Users\liams\dev\my-rest-server\node_modules\source-map-support\source-map-support.js:568:25)
    at Module.m._compile (C:\Users\liams\AppData\Local\Temp\ts-node-dev-hook-8639111545614118.js:69:33)
    at Module._extensions..js (node:internal/modules/cjs/loader:1149:10)
    at require.extensions.<computed> (C:\Users\liams\AppData\Local\Temp\ts-node-dev-hook-8639111545614118.js:71:20)
    at Object.nodeDevHook [as .ts] (C:\Users\liams\dev\my-rest-server\node_modules\ts-node-dev\lib\hook.js:63:13)
    at Module.load (node:internal/modules/cjs/loader:975:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Module.require (node:internal/modules/cjs/loader:999:19)
[ERROR] 20:08:00 TypeError: Cannot read properties of undefined (reading 'protect')

任何想法我错过了什么?

编辑:与其在此处发布我的代码的每一行,您可以在 repo 中看到它:https://github.com/dotDone/my-rest-server/tree/auth

【问题讨论】:

  • userRouter 中的RoutesController 是什么?如何导入?
  • tslint 告诉你有问题的事实,不是问题。问题可能出在出口上。拜托,你能分享一下 userRoutes 和 RoutesController 的整个文件吗?
  • 我在帖子中添加了repo链接,而不是在这里发布所有代码

标签: node.js typescript express async-await


【解决方案1】:

当您在用户控制器中使用时,您的 RouteController 尚未定义。 (您的架构可以改进,但我会尽量只回答您的问题,只要知道有更好的方法来组织这一切) 试试下面的

把 UserRoutes 变成一个类

import { Router } from 'express'
import * as userController from '../controllers/user.controller'

class UserRoutes {
constructor(routesController) {
this.userRouter: Router = Router();
this.routesController = routesController;
this.initRoutes();
}

initRoutes() {
userRouter.route('/').get(userController.getUsers).post(userController.createUser).put(userController.editUser).delete(userController.deleteUser)
userRouter.route('/me').get(this.routesController.protect, userController.getMe)
} 

}

然后在你的 server.ts 中,创建另一个函数,例如调用它 initRoutes 来做这样的事情

constructor() {
    this.startServer().then(() => this.startControllers()).then(() => this.initRoutes()).catch(err => console.log(err))
}

...

initRoutes() {
  this.userRoutes = new UserRoutes(this.routesController);
}

【讨论】:

  • 那么问题是protect是一个方法吗?我在 server.ts 中创建了一个 RoutesController 实例,我尝试过使用server.routesController.protect,但遇到了同样的问题。
  • 不,问题不在于protect 是一种方法,问题在于routesControllerundefined 你试图在哪里做routesController.protect
  • 我重新组织了几乎所有的东西,现在它可以工作了。我不知道这是否是一个好的组织,但现在一切正常!对组织的任何反馈将不胜感激。 github.com/dotDone/my-rest-server/tree/dev
  • 稍后我会回顾一下,如果我可以为您的代码带来任何东西,请告诉您^^
猜你喜欢
  • 2021-12-21
  • 2021-06-30
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 2018-07-04
  • 2018-08-01
  • 1970-01-01
  • 2020-07-13
相关资源
最近更新 更多