промежуточное ПО gin gonic, как получить статус сбоя / успеха для следующего обработчика в цепочке

Я пишу промежуточное ПО, используя структуру gin gonic golang. Я хочу знать в своем промежуточном программном обеспечении, если вызов следующего обработчика завершился неудачно, и принять меры на основе этого.

func foo() gin.HandlerFunc {
    //do something..
    c.Next()
    //do something based on result of c.Next()
}

Как я могу это сделать? В документации к следующему варианту мало информации https://godoc.org/github.com/gin-gonic/gin#Context.Next

Можете ли вы предложить какие-либо предложения. Я в основном хочу проверить несуществующие конечные точки api, например, кто-то вводит URL-адрес, для которого у нас нет конечной точки api, тогда я могу обнаружить это здесь.


person SeattleOrBayArea    schedule 11.12.2015    source источник
comment
Вы разрешили это? У меня такой же вопрос   -  person R wang    schedule 16.11.2018


Ответы (2)


На Engine есть метод, называемый NoRoute, с помощью которого вы можете передать маршрут обработчики для обработки 404 и т. д.

person jmaloney    schedule 11.12.2015
comment
спасибо, я использую NoRoute, я все еще вижу, как вызывается мое промежуточное программное обеспечение (когда маршрут не найден), поэтому мне все еще нужен контроль внутри моей функции промежуточного программного обеспечения. - person SeattleOrBayArea; 14.12.2015

Я собираюсь ответить на свой вопрос, так как нашел способ справиться с такими проблемами, когда маршрут не найден / метод не найден и т. Д. Идея состоит в том, чтобы установить ошибку в контексте джин с помощью context.Error () из NoRoute / NoMethod обработчики. Это добавляет ошибку к срезу ошибок в c.Errors, которые впоследствии могут быть использованы внутри вашей функции промежуточного программного обеспечения.

func MyMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
       //do something here
       c.Next()
       //do something based on error in c.
       if c.Errors.Error() != nil {
           //error case, get out
           return 
       }
       //else continue regular processing. 
    }
}


engine.NoRoute(func(c *gin.Context) {
    c.JSON(404,
        gin.H{"error": gin.H{
            "key":         "not allowed",
            "description": "not allowed",
        }})
    c.Error(errors.New("Failed to find route")) //Set the error here. 
})

Надеюсь, это поможет.

person SeattleOrBayArea    schedule 19.12.2015