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'的情况下被调用