TypeError:没有'new'就不能调用类构造函数MixinStrategy

Posted

技术标签:

【中文标题】TypeError:没有\'new\'就不能调用类构造函数MixinStrategy【英文标题】: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/nest 和github.com/nestjs/passport 中针对不正确的 PassportStrategy 类型打开有关此示例的问题(19-auth 未命中 @types/passport-jwt 依赖项)。无论如何,我无法使这个示例可行。服务器运行但以 404 响应。 不确定此时是否可以做任何事情。我曾认真考虑将 NestJS 作为我的下一个框架,但它似乎还不够成熟。文档有些缺乏,开箱即用的示例并没有真正的帮助。感谢您向 SO 提出这个问题,这令人大开眼界。 检查您的 tsconfig.json 以确保“目标”是“es6” 【参考方案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 的信息,很高兴知道,

以上是关于TypeError:没有'new'就不能调用类构造函数MixinStrategy的主要内容,如果未能解决你的问题,请参考以下文章

挂载钩子中的错误:“TypeError:没有'new'就不能调用类构造函数节点”

Flux Utils TypeError:没有'new'就不能调用类构造函数App

Sequelize Typescript Sequelize Typescript TypeError:没有'new'就不能调用类构造函数模型

NexusJS 错误:TypeError:类构造函数 GraphQLNonNull 不能在没有“新”的情况下调用

Jest - Angular 9 - 类构造函数 SomeComponentClass 不能在没有'new'的情况下被调用

Nuxt 抛出:没有“new”就无法调用类构造函数