取势 明道 优术

作者为 扶 凯 发表

 

名称

21: 保证你的应用和中间件的可用性

我们一直在谈论怎么适配现有的 Web 开发框架到 PSGI 中和编写新的应用使用 PSGI 的接口,但我们还没有谈到任何有关错误处理.

 


处理错误

我们已经有不错的 stack trace 中间件,是默认启用的. 所以如果用户的程序出错错误,就能抓到并友好的显示出出错的信息,但如果这些错误或者 bug 是一个中间件生产或者是因为 Web 应用框架适配程序本身出错啦?

试下下面的代码

    > plackup -e 'sub { return [ 0, {"Content-Type","text/html"}, "Hello" ] }'

再说,虽然并不是每个最终用户都会来写原生 PSGI 接口, 但是,如果有一个错误在中间件或框架适配器本身,这可能会引起让现有良好的仿真接口发生问题.

当你从浏览器打开这个应用的界面时,这个服务器会挂掉:

    Not an ARRAY reference at lib/Plack/Util.pm line 145.

和类似的错误,上面的原因是因为 response 的格式并不是 PSGI 接口声明的那样, 状态码不可用, HTTP 的头信息不是数组引用, 响应的内容在这是一个字符串,并不是数组引用.

 


Lint 中间件

在运行的时候检查每个服务器上的 HTTP 请求,这个方法并不好.因为这是重复的代码并会在每个请求到来时都这样操作,从性能的角度来看效率是不行的.我们需要更好的确认应用,中间件和后端服务器来进行验证是否遵守了 PSGI 的接口.只在开发过程中使用这些测试套件,在生产环境中禁用这些会对性能产生影响的东西.

Middleware::Lint 是一个用来确认 HTTP 请求和 HTTP 响应接口来进行验证的中间件,使用这个中间件在你的应用中:

    > plackup -e 'enable "Lint"; sub { return [ 0, { "Content-Type"=>"text/html" }, ["Hello"] ] }'

现在的应用的 HTTP 请求会给你更加人性化的提示:

status code needs to be an integer greater than or equal to 100 at …

从现在开始 Lint 的中间件会检查所有的响应的值是否是 PSGI 的格式.

当你开发一个新的框架适配器和中间件时,可以启动 Middleware::Lint 在你的开发环境中来进行检查.

 


写新的 PSGI 的服务器

Middleware::Lint 会对你的接口进行 HTTP 请求和 HTTP 响应的确认检查,所以很合适用它来开发新的 PSGI 的 Web 服务器.如果你是服务器的开发人员,还想有一个更全面的测试工具,用以确保您的服务器运行是正常的,那就使用 Plack::Test::Suite 吧.

你可以看到现在的测试目录 t/Plack-Server 中怎么样使用这个工具,这它需要定义预期的 HTTP 请求和 HTTP 响应的内容,并会做大量 PSGI 服务器后端的测试.现有 Plack::Server 后端在 Plack 核心发行以及其他 CPAN 发行中都包括所有这些测试套件.

 


AUTHORS

原文:http://advent.plackperl.org/2009/12/day-21-lint-your-application-and-middleware.html 译者: 扶凯

 


NOTE

本文由个人根据英文原文翻译,可能由于水平有限,译文质量望读者见谅,不屑一顾者请绕道远行,英文好的请直接看原著(最好也帮助翻译).

来了就留个评论吧! 没有评论