首页 > 解决方案 > Javascript 类不是构造函数

问题描述

我有一个状态机,我正在其中进行转换以从一种状态移动到另一种状态。(例如 ReserveState -> StartState)

在这种特殊情况下,我从 ReserveFailedVMState 过渡到 ReserveVMState

ReserveFailedVMState 的代码:

const { AbstractVMCtrlState } = require("./AbstractVMCtrlState");
const { ReserveVMState } = require("./ReserveVMState");
const { TerminateDuringReservationState } = require("./TerminateDuringReservationState");
const { ResourceUnavailableState } = require("./ResourceUnavailableState");

//>>>> don't change the CUSTOM CODE comments, if you do generation will overwrite your code >>>>
//###START_CUSTOMCODE1
const { Config } = require("../config/Config");
const { Tasker } = require("../libs/tasker/src/Tasker");
//###END_CUSTOMCODE1
class ReserveVMFailedState extends AbstractVMCtrlState {
  //>>>> don't change the CUSTOM CODE comments, if you do generation will overwrite your code >>>>
  //###START_CUSTOMCODE2
  async onEnterState() {
    //TODO: try to remove the reservation, if exists
    this.logMsg("Could not reserve a VM");
    const config = Config.getConfig();
    if (this.SM.getQueueReservationRetries() <= config.queueReservation.requeueReservationMaxRetries) {
      this.logMsg("Retrying queue for Starting a Reservation, attempt # " + this.SM.getQueueReservationRetries());
      this.SM.setIncreaseQueueReservationRetries();
      await this.retryReserveVMCloudTask();
    } else {
      this.logMsg("After maxRetries, reservation could not be done");
      await this.SM.resourceUnavailable();
    }
  }

  // kicking off a cloud task for retrying to reserve a VM
  async retryReserveVMCloudTask() {
    const run_id = this.getRunId();
    const tasker = new Tasker();
    const vmStartTaskId = await tasker.sendRetryReserveVM(run_id);
    this.SM.setVmStartTaskId(vmStartTaskId);
  }
  //###END_CUSTOMCODE2

  constructor() {
    super();
  }

  async onExitState() {}

  reserveVM() {
    this.logMsg("holaaaaa");
    return new ReserveVMState();
  }

  terminateRequested() {
    return new TerminateDuringReservationState();
  }

  resourceUnavailable() {
    return new ResourceUnavailableState();
  }
}

const serialijse = require("serialijse");
serialijse.declarePersistable(ReserveVMFailedState);

module.exports = { ReserveVMFailedState };

其中 retryReserveVMCloudTask 函数启动一个转换以再次移动到 ReserveVMState

ReserveVMState 的代码:

const { AbstractVMCtrlState } = require("./AbstractVMCtrlState");
const { WaitForReservationReadyState } = require("./WaitForReservationReadyState");
const { TerminateDuringReservationState } = require("./TerminateDuringReservationState");
const { ReserveVMFailedState } = require("./ReserveVMFailedState");

//>>>> don't change the CUSTOM CODE comments, if you do generation will overwrite your code >>>>
//###START_CUSTOMCODE1
const { reserveVM } = require("./vm-reservation/reserveVM");
//###END_CUSTOMCODE1
class ReserveVMState extends AbstractVMCtrlState {
  //>>>> don't change the CUSTOM CODE comments, if you do generation will overwrite your code >>>>
  //###START_CUSTOMCODE2
  async onEnterState() {
    // todo later djs fix retries and allow to try on other zones
    this.SM.setCurrentVMZone("europe-west4-b");

    // queue a VM reservation on the GPC cloud
    const run_id = this.getRunId();
    const vmZone = this.SM.getCurrentVMZone();
    const resName = this.getReservationName();

    
    try {
      await reserveVM(run_id, resName, vmZone, "gcp", this.logMsg);
      this.logMsg(`Reservation successful: ${resName} `);
      await this.SM.waitForReservationReady();
    } catch (e) {
      console.error(JSON.stringify(e));
      this.logMsg(`Reserve VM exception:  ${e.name}:  ${e.message}`);
      await this.SM.reserveVMFailed();
    }
  }
  //###END_CUSTOMCODE2
  
    constructor() {
    super();
  }

    
  async onExitState() {
    
  }
  
  waitForReservationReady() {
    return new WaitForReservationReadyState();
  }
  
  terminateRequested() {
    return new TerminateDuringReservationState();
  }
  
  reserveVMFailed() {
    return new ReserveVMFailedState();
  }
  
}

const serialijse = require("serialijse");
serialijse.declarePersistable(ReserveVMState);

module.exports = { ReserveVMState };

我实现了一个记录器,当我尝试这种转换时,我收到以下错误:

[OSM] 5f64cae6df60d0c4734aa87b - OSM 异常:TypeError:ReserveVMState 不是构造函数

我尝试了不同的方法,但似乎都没有奏效,我在这里错过了什么?

提前致谢

标签: javascriptoop

解决方案


通过 console.log 上的提示,我意识到我的 ReserveVMState 是未定义的,这有点奇怪。经过调查,问题是由于 NodeJs “require”,node.js require() 缓存 - 可能无效?我将此链接用作帮助,我的最终解决方案是将 ReserveVMFailedState 上的“要求”更改为此

const { ReserveVMState } = requireUncached("./ReserveVMState");

上面的链接中提供了 requireUncached 函数。


推荐阅读