当前位置: 首页 > 面试题库 >

转到:如何使用中间件模式?

廖永长
2023-03-14
问题内容

我有一个仅在特定条件下才能执行的函数(例如 role ==’Administrator’ )。现在,我使用 “ if”
语句。但是在某些情况下,情况可能会很多,而长定义的 “如果” 看起来并不那么美观。
Go(或与Go框架相关)中是否可用的机制允许实现中间件 概念 (动作过滤器)?

例如,ASP.NET MVC允许执行以下操作:

[MyFilter]
public ViewResult Index()
{
     // Filter will be applied to this specific action method
}

因此,在单独的类中实现的MyFilter()可以实现更好的代码组成和测试。

更新:
Revel(用于Go的Web框架)提供了与Interceptors类似的功能(由动作调用之前或之后由框架调用的功能):https
:
//revel.github.io/manual/interceptors.html


问题答案:

这种事情通常是用Go中的 中间件 完成的。最简单的例子是:

package main

import (
    "fmt"
    "html"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", handler)
    http.HandleFunc("/foo", middleware(handler))

    log.Fatal(http.ListenAndServe(":8080", nil))
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
}

func middleware(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        r.URL.Path = "/MODIFIED"

        // Run the next handler
        next.ServeHTTP(w, r)
    }
}

如您所见,中间件是具有以下功能的函数:

  1. 接受一个http.HandlerFunc参数
  2. 返回一个http.HandlerFunc;
  3. 调用http.handlerFunc传入的。

通过这种基本技术,您可以根据需要“链接”许多中间件:

http.HandleFunc("/foo", another(middleware(handler)))

这种模式有一些变体,大多数Go框架使用的语法略有不同,但是概念通常是相同的。



 类似资料:
  • 我已经创建了一个新的中间件名称Adminpanel 和注册中间件 和路线 }); 但当我运行时,它要求我尝试获取非对象的属性,这意味着我不能在这里访问Auth类,有人能告诉我错误是什么以及如何在中间件中访问Auth Facade吗。 这是我的身份验证码 谢谢

  • 如何使用用户指定的架构将dataframe转换为Avro格式?

  • 问题内容: 我在Linux机器上安装的Oracle服务器上有一个数据库架构。我需要在转储文件中导出与架构相关的信息。 这个怎么做 ? 问题答案: 它取决于Oracle的哪个版本?较旧的版本需要exp(导出),较新的版本需要expdp(数据泵);exp已被弃用,但在大多数情况下仍然有效。 在开始之前,请注意Data Pump会导出到服务器端Oracle“目录”,这是在数据库中映射到物理位置的Orac

  • 问题内容: Mongoose文档中建议我应该能够使用插入“ init”钩子的中间件来控制流。 但是,到目前为止,只有“保存”和“验证”才能获得成功。 当我做这样的事情时,这些中间件都不会被调用: 我想念什么吗? 问题答案: 事实证明,在创建新模型时不会触发“ init”事件/挂钩,而仅在从数据库中加载现有模型时才会触发。看来我应该改用pre / validate挂钩。

  • 1.在自己网站需要调用的页面中用script引用cordova.js <script type="text/javascript" src="/cordova.js"></script> 注意:引用js,路径必须写/cordova.js。 2.在js中正确使用cordova插件 以下代码以扫描二维码插件为例: <script type="text/javascript"> var dev

  • 我正在尝试将收藏转储到。json文件,但在看过pymongo教程后,我找不到任何与之相关的东西。 教程链接:https://api.mongodb.com/python/current/tutorial.html