2015-12-11 5 views
3

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

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, тогда я могу его обнаружить здесь.

ответ

2

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

+0

спасибо, я использую NoRoute, я по-прежнему вижу, что мое промежуточное программное обеспечение вызывается (когда маршрут не найден), поэтому я все еще хочу контролировать внутри моей функции промежуточного программного обеспечения. –

0

Я собираюсь ответить на мой вопрос, так как я нашел способ справиться с такими проблемами, когда маршрут не найден/метод не найден и т. Д. Идея заключается в установке ошибки в контексте gin с использованием context.Error() from обработчики 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. 
}) 

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