【问题标题】:TypeError: Class constructor MixinStrategy cannot be invoked without 'new'TypeError:没有'new'就不能调用类构造函数MixinStrategy
【发布时间】:2018-11-12 06:31:21
【问题描述】:

我一直在关注 jwt 示例,就像在此处找到的 https://docs.nestjs.com/techniques/authentication 一样。我复制并粘贴了示例。在 npm 安装必要的位和 bops 后,我得到了这个错误,这在我刚刚复制的示例中没有发生。我不知道这意味着什么!有人有什么想法吗?

TypeError: Class constructor MixinStrategy cannot be invoked without 'new'

   8 | export class JwtStrategy extends PassportStrategy(Strategy) {
   9 |   constructor(private readonly authService: AuthService) {
> 10 |     super({
  11 |       jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
  12 |       secretOrKey: 'secretKey',
  13 |     });

  at new JwtStrategy (data/auth/strategies/jwt.strategy.ts:10:5)
  at resolveConstructorParams (../node_modules/@nestjs/core/injector/injector.js:64:84)
  at Injector.resolveConstructorParams (../node_modules/@nestjs/core/injector/injector.js:86:30)

【问题讨论】:

  • 你能提供一种复制问题的方法——回购等吗?可能特定于包版本或其他。
  • 当然,克隆这个文件夹github.com/nestjs/nest/tree/master/sample/19-auth npm i && npm start 它会在 Windows 10 和节点 8.11.2 上显示出来
  • 我无法复制您遇到的错误。 MixinStrategy 没有问题。您当前的代码可能与您链接的代码不同。但是我在打字方面遇到了问题。我建议在github.com/nestjs/nestgithub.com/nestjs/passport 中针对不正确的 PassportStrategy 类型打开有关此示例的问题(19-auth 未命中 @types/passport-jwt 依赖项)。无论如何,我无法使这个示例可行。服务器运行但以 404 响应。
  • 不确定此时是否可以做任何事情。我曾认真考虑将 NestJS 作为我的下一个框架,但它似乎还不够成熟。文档有些缺乏,开箱即用的示例并没有真正的帮助。感谢您向 SO 提出这个问题,这令人大开眼界。
  • 检查您的 tsconfig.json 以确保“目标”是“es6”

标签: typescript jwt passport.js nestjs


【解决方案1】:

在我的情况下,问题出现在 tsconfig.ts 文件中,我使用的是 nest.js,在 cli 命令 typeorm init 之后,它会覆盖 tsconfig,因此 npm run start:dev 抛出异常:TypeError:无法调用类构造函数 MixinStrategy没有“新”

注意:也会用旧版本的 typescipt, @ts/node, ts-node 覆盖 package.json

【讨论】:

    【解决方案2】:

    project 缺少 @types/passport-jwt 类型,因此应额外安装:

    npm i -D @types/passport-jwt
    

    这会导致

    src\auth\jwt.strategy.ts (10,6):调用目标不包含任何签名。 (2346)

    错误,因为@nestjs/passport 没有正确输入; PassportStrategy return type is any.

    为了解决这个问题,

    @Injectable()
    export class JwtStrategy extends PassportStrategy(Strategy) {
    ...
    

    应该改为:

    import { ExtractJwt, Strategy } from 'passport-jwt';
    import { AbstractStrategy, PassportStrategy } from '@nestjs/passport';
    ...
    const PassportJwtStrategy: new(...args) => AbstractStrategy & Strategy = PassportStrategy(Strategy);
    
    @Injectable()
    export class JwtStrategy extends PassportJwtStrategy {
    ...
    

    【讨论】:

    • 此问题已在1.0.11 补丁版本中修复。
    • 在 tsconfig.json 中将“target”设置为“ES5”时,原始代码和 this 都会抛出“TypeError: Class constructor MixinStrategy cannot be invoked without 'new'”。 ES5有办法吗? @estus
    • @Smartkid 我希望 ES5 目标是这样,因为 TS 使用已建立的继承配方_this = Parent.call(this)。预计整个类层次结构都被转译以使其工作,否则这将导致错误,因为没有new 就无法调用本机类。为什么要在 Node 中使用 ES5 目标?
    • @estus 感谢您的解释。我使用 yarn 工作区在一个 Nestjs 服务器项目和一个基于反应的项目(它针对 ES5 以避免 babel)之间共享代码。旧版本 WebStorm 的 Jest 支持似乎使用工作区根目录下的 tsconfig 运行单元测试,并忽略子项目下的 tsconfig。看起来 WebStorm 在 2018.1.4 修复了这个问题。
    • @Smartkid 感谢您提供有关 Webstorm 的信息,很高兴知道,
    猜你喜欢
    • 2019-04-21
    • 2021-05-17
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 2021-05-24
    • 2020-11-27
    相关资源
    最近更新 更多