[beego]Beego的Controller里面有没有方法可以中止输出

2023-12-11 710 views
8

比如,我现在判断密码错误之后,我输入一个json,然后下面的代码就不执行了。按照我现在所熟知的方式就是直接在后面写一个return,

有没有像PHP一样的exit方法一样,直接结束掉当前后面的输入。因为,我写了一个公共方法来管理操作提示,在提示里面就结束掉当前的后面的代码执行。

回答

1

您可以使用this.Ctx.Abort中止执行。

9

@pengfei-xue 你说的这个方法我试过了。它必须要求输入状态码和内容。而我只想在执行某个模板输出之后,就不执行后面的代码了。

我的代码如下: // 提示页面。 // @param Message 提示信息。 // @param Second 提示信息跳转前等待秒数。 // @param Url 跳转的URL。 func (this *IndexController) tip(Message string, Second int, Url string) { this.Data["Message"] = Message this.Data["Second"] = Second this.Data["Url"] = Url this.TplNames = "Public/tip.tpl" }

当我在其他Controller里面调用了tip方法的时候,调用的Controller在调用处后面的代码就不执行了。但是,tip()方法里面的渲染能正确执行。

9

如果可以的话,我希望添加一个。谢谢!

9

Agreed with @pengfei-xue it's impossible

func (this *IndexController) other() {
     // some logic
     tip() // simple use tip can not interrupt the logic without panic
     return // You can use `return` exit the logic.
     // some logic
}
7

@slene 我现在就是这样写的。但是,判断越多,那这个return就会越来越多。

7

这个方法什么时候能支持呢。

现在我在前置方法里面判断登录与否。然后,通过跳转并中止后续代码执行出错了。

//this.Redirect("/Index/Login", 200) //this.Abort("200")

以上两个方法都是在Prepare()方法里面执行的,但是,后面的还是会输出。好忧伤。能否实现一个方法,调用此方法,后续的映射的方法就不会执行了。

谢谢。

4

调用this.Abort("200")还会继续执行?

5

this.Abort("200") 会在标准输出里面输出trace信息吧。。这也不妥当吧 如: [C] Handler crashed with error 200 [C] C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist550409343/go/src/pkg/runtime/panic.c 248

1

@wearecs 是啊。不管怎么都不能中止后面的操作方法。这如何是好呢?求助Beego各位设计师。

@slene @astaxie

4

为什么不在ServerJson之类的输出函数后面就直接终端后续的逻辑了呢?既然输出了结果,后面的逻辑理应就不再继续跑了。

1

@wearecs 因为我要在执行所有方法之前做权限验证,如果没有登录就不需要执行后续的方法了。因为后续的方法都跟Session有关系,如果没有登录session就没有。

如果放到方法里面操作。那么会导致每个方法都有判断是否登录。那就没有意义了。

9

我在控制器中添加了一个功能,现在您可以通过调用中断登录StopRun

type RController struct {
    beego.Controller
}

func (this *RController) Prepare() {
    this.Data["json"] = "astaxie"
    this.ServeJson()
    this.StopRun()
}
1

@astaxie 我刚刚试用了一下,功能一切正常。但是,离我实际需要可能还差一点。现在可以直接在前置方法里面输出了。但是,假如,我希望在前置方法里面输出一个模板并渲染这个模板并输出。那么这个时候,调用StopRun()就是空白。

之所以,有这样的需求。是因为,我做了一个整站的通用提示页面。每当有错误或者提醒的时候,我只需要传提示信息以及跳转的地址就能正常提示用户。代码如下:

// 提示页面。 // @param Message 提示信息。 // @param Second 提示信息跳转前等待秒数。 // @param Url 跳转的URL。 func (this *CommonController) Tip(Message string, Second int, Url string) { this.Data["Message"] = Message this.Data["Second"] = Second this.Data["Url"] = Url this.TplNames = "Public/tip.tpl" return }

那么此时,我在前置方法里面通过判断用户是否登录来调用这个Tip方法。但是,目前StopRun不支持。不知道有没有变通的方法。

其次是: this.Ctx.WriteString("0") 这个代码后面调用this.StopRun()不会输出。

2
// 提示页面。
// @param Message 提示信息。
// @param Second 提示信息跳转前等待秒数。
// @param Url 跳转的URL。
func (this *CommonController) Tip(Message string, Second int, Url string) {
    this.Data["Message"] = Message 
    this.Data["Second"] = Second
    this.Data["Url"] = Url
    this.TplNames = "Public/tip.tpl"
    this.Render()
    this.StopRun()
}
7

2、 this.Ctx.WriteString("0") can output in my example.

type RController struct {
    beego.Controller
}

func (this *RController) Prepare() {
    this.Ctx.WriteString("000")
    this.StopRun()
}

the page output "000" qq20131217-1

0

@astaxie 谢谢。我再试试。

6

@astaxie 调用ServeJSON后,我是不想再写行代码调StopRun去中止了。为什么不在ServeJSON里面帮忙中止呢?