当我在 .net 世界中并使用 MVC 时,当想要进行横切关注点(如日志记录、身份验证、事务管理等)时,我会使用 DI 与 AOP 配对来基本上将属性放在需要代理/编织的方法上.
所以它可能看起来像:
public class SomeController
{
[Authenticate]
public ActionResult SomeAuthenticatedAction() {}
public ActionResult NotAuthenticatedAction() {}
}
因此,鉴于上述情况,当调用 SomeAuthenticatedAction 时,它会检查对授权 cookie 的请求,并围绕它做一些逻辑,然后用 401 或其他东西轰炸用户。它会知道这样做,因为它有一个属性,在运行时它知道挂钩和代理。
现在我在 javascript 领域,正在寻求获得相同类型的功能,但为该平台做最好的方式。所以我想知道我应该如何在 nodejs 中执行此操作,因为 javascript 中没有任何类型的属性范例,因此既没有将身份验证根植到app.* (get,post etc)
我不喜欢的每个调用中,也没有在应用程序入口点代理我知道的每个操作需要进行身份验证,这也不理想。
那么有没有办法让我表明一个方法应该应用一些横切关注点,而不实际将逻辑放在那里?这样Web代码不知道身份验证机制,并且应用程序入口点不知道具体方法,它只知道它想要所有带有一些元数据的方法?
我希望这是有道理的,如果你不经常使用 AOP,你可能会认为我在说谜语,但是这样做可以让我的代码更容易测试和维护,也让我可以非常快速地重新配置应用程序。
到目前为止,我已经找到了Hooker,它可以完成难题的代理部分,尽管我不太确定如何在其中获取底层请求对象,但我不会认为 JS 中的对象代理太痛苦了,但是我只需要找到一种方法来识别拦截方法......任何信息都会很棒。
== 编辑 ==
在阅读了更多之后,看起来我应该做的是使用中间件层来做我需要的事情,因为这至少可以允许更简单的代码并且路由的意图会更清晰。一旦我发现更多或出现更好的答案,将继续寻找回来。