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 返回陣列。
