2017-02-11 8 views
1

Я играю с Китурой. Я установил один маршрутизатор конечную точку, которая выглядит следующим образом:Упростить Kitura RouterHandler, удалив «следующее» закрытие?

let router = Router() 

router.all() { _, response, next in 
    response.headers["Content-Type"] = "application/json; charset=utf-8" 
    next() 
} 

router.get("/hello") { _, response, next in 
    response.send("{\"message\": \"Hello World\"}") 
    next() 
} 

Kitura.addHTTPServer(onPort: 9143, with: router) 
print("Application Server Starting...") 
Kitura.run() 

Я действительно путают/разочарование этим next закрытия/параметра обратного вызова. Многие (возможно устаревшие?) Учебники не упоминают и не включают в себя, но если я его не назову, мой маршрутизатор зависает, а ответ клиента никогда не отправляется.

Есть ли способ для меня избежать необходимости называть это в моем RouterHandler? Или это называется автоматически? Кажется, огромным источником потенциальной человеческой ошибки необходимо вручную выполнить этот обратный вызов в каждом методе, и это добавляет беспорядок. (Другие структуры, такие как Spring Web, выполняют цепочку автоматически, нет необходимости в вызове next().)

ответ

2

Вы можете позвонить response.end(), когда вы закончите отправку ответа, и в этом случае вам не нужно звонить next(). next() используется для обеспечения гибкости, поэтому последующие обработчики могут быть вызваны или пропущены по мере необходимости.

Но вы поднимаете хорошую точку, может быть более интуитивно, чтобы вызвать next() автоматически, если флажок явно не установлен для пропуска последующих обработчиков, и мы рассмотрим его. Благодаря!

При просмотре кода появляется обратная обработка Kitura (которая вызывает response.end(), если она не была вызвана каким-либо из обработчиков) зависит от вызова next(), чего это действительно не должно быть. Я исправлю это. Еще раз спасибо за это.

+0

А, спасибо - я попробую это. Мне показалось странным, что даже учебники на веб-сайте IBM не включают '.end()', * или * вызов 'next()': https://developer.ibm.com/swift/2016/02/ 22/building-end-end-cloud-apps-using-swift-kitura/ –

+0

Мы внесли изменения в Kitura 1.6.1, которые завершат ответ, если все обработчики закончатся, не закончив его явно. Это должно помешать другим столкнуться с проблемой, с которой вы столкнулись. Благодаря! – Navneet