網站搜尋

node.js - 在類別裝飾器上,target.prototype 是一個空對象


我正在嘗試在 Express 中實現裝飾器(我不想下載任何套件來做到這一點)。我依照一個指南寫了一個 Get 裝飾器和一個 Controller 裝飾器。但在 Controller 裝飾器中的目標是一個空對象。

控制器裝飾器

export function Controller(prefix: string) {
  return function (target: Function) {
    for (let key in target.prototype) {
      const routeHandler = target.prototype[key];
      const path = Reflect.getMetadata("path", target.prototype, key);
      const method = Reflect.getMetadata("method", target.prototype, key);
      const middlewares = Reflect.getMetadata(
        "middlewares",
        target.prototype,
        key
      );

      if (path) {
        console.log("has path"); //never logs out
        router[method](`${prefix}${path}`, ...middlewares, routeHandler);
      }
    }
  };
}

獲取裝飾器

export function Get(path: string) {
  return function (target: any, key: string, desc: PropertyDescriptor) {
    Reflect.defineMetadata("path", path, target, key);
    Reflect.defineMetadata("method", "get", target, key);
  };
}

答案#1

透過 class 語法建立的方法/屬性是 不可列舉的。因此,你需要使用 Object.getOwnPropertyNames(),它 會返回所有屬性的陣列(包括不可列舉的屬性)。

那麼在你的情況下,你可能想要將現有的 for 迴圈轉換成;

for(let key of Object.getOwnPropertyNames(target.prototype))

自現在起,Object.getOwnPropertyNames 返回陣列。