`
qq362228416
  • 浏览: 33051 次
社区版块
存档分类
最新评论

openresty 前端开发轻量级MVC框架封装一(控制器篇)

阅读更多
#### 通过前面几章,我们已经掌握了一些基本的开发知识,但是代码结构比较简单,缺乏统一的标准,模块化,也缺乏统一的异常处理,这一章我们主要来学习如何封装一个轻量级的MVC框架,规范以及简化开发,并且提供类似php所见即所得的能力

## 统一入口

通常来说一个mvc框架会有一个统一的入口点,类似于spring mvc的DispatcherServlet,会拦截所有的请求,也就是/,于是我们可以得出我们的入口点

conf/nginx.conf
```
worker_processes  1;

error_log logs/error.log notice;

events {
    worker_connections 1024;
}

http {
    lua_package_path "/Users/john/opensource/openresty-web-dev/demo8/lua/?.lua;/Users/john/opensource/openresty-web-dev/demo8/lualib/?.lua;/usr/local/openresty/lualib/?.lua";
    server {
        listen 80;
        server_name localhost;
        lua_code_cache off;

        location / {
        content_by_lua_file lua/mvc.lua;
        }

        location ~ ^/js/|^/css/|\.html {
        root html;
        }
    }
}
```

除了静态文件js/css/html文件,其他的请求都会被我们的mvc.lua处理。

## 默认页面

当请求uri为空时,默认返回index.html页面,当然也可以自己定义,实现这个效果很简单

```
local uri = ngx.var.uri
-- 默认首页
if uri == "" or uri == "/" then
    local res = ngx.location.capture("/index.html", {})
    ngx.say(res.body)
    return
end
```

## url解析

这里简单的把url解析成模块名模块方法,根据/分割,如果只有模块名,没有方法名,则默认为index方法

```
local m, err = ngx.re.match(uri, "([a-zA-Z0-9-]+)/*([a-zA-Z0-9-]+)*")

local moduleName = m[1]     -- 模块名
local method = m[2]         -- 方法名

if not method then
    method = "index"        -- 默认访问index方法
else
    method = ngx.re.gsub(method, "-", "_")   
end
```

## 动态Controller模块

得到模块名之后,需要动态引入模块,通过pcall,然后再调用模块的方法

```
-- 控制器默认在web包下面
local prefix = "web."      
local path = prefix .. moduleName

-- 尝试引入模块,不存在则报错
local ret, ctrl, err = pcall(require, path)

local is_debug = true       -- 调试阶段,会输出错误信息到页面上

if ret == false then
    if is_debug then
        ngx.status = 404
        ngx.say("")
    end
    ngx.exit(404)
end

-- 尝试获取模块方法,不存在则报错
local req_method = ctrl[method]

if req_method == nil then
    if is_debug then
        ngx.status = 404
        ngx.say("<p style='font-size: 50px'>Error: <span style='color:red'>" .. method .. "()</span> method not found in <span style='color:red'>" .. moduleName .. "</span> lua module !")
    end
    ngx.exit(404)
end

-- 执行模块方法,报错则显示错误信息,所见即所得,可以追踪lua报错行数
ret, err = pcall(req_method)

if ret == false then
    if is_debug then
        ngx.status = 404
        ngx.say("")
    else
        ngx.exit(500)
    end
end
```

## 异常处理

可以看到,从引入模块,到获取模块方法,已经执行方法,都有可能报错,这里通过pcall来进行调用,这种方式可以安全的调用lua代码,不会导致异常中断,然后通过定义一个变量,来区分是否为开发调试阶段,如果是则把错误信息输出到浏览器端,否则直接报404或者500,避免把错误信息输出到客户端,导致代码泄漏。

至此,一个简单的mvc框架已经可以使用了,但是现在还只能做前端渲染,下一章,我讲介绍如果进行服务端渲染。

[示例代码](https://github.com/362228416/openresty-web-dev) 参见demo8部分
0
0
分享到:
评论

相关推荐

    dodolu:基于openresty lua的轻量级web框架

    dodolu 基于openresty的nginx lua modlue的轻量级web框架,将原生的lua api做了简单封装,并提供了根据配置文件,自动生成route模块,nginx.conf配置,logger模块的功能,减轻了开发工作量,避免重复手写大量易错的...

    一个基于openresty的http接口和web开发框架luastar.zip

    luastar是一个基于openresty的高性能高并发开发框架,支持http接口和web开发。 luastar使用openresty-1.7.10.2在macOS和centos6.5系统上测试过。 luastar主要特性如下: request/response封装...

    Python-一个基于OpenResty的仿Yii的web框架

    标题 "Python-一个基于OpenResty的仿Yii的web框架" 暗示了这个项目是用Python语言创建的一个Web开发框架,它受到了OpenResty和Yii框架的启发。OpenResty是一个集成了Nginx与LuaJIT的高性能Web平台,而Yii是一款流行...

    openresty官方学习资料

    OpenResty是基于Nginx和LuaJIT的开源项目,它将Nginx的高性能与Lua的轻量级脚本能力相结合,为Web应用开发提供了全新的可能性。 首先,我们来看《OpenResty 入门到精通》。这本书主要介绍了OpenResty的基础概念和...

    openresty-web-dev:openresty网站演示

    本项目是我写的一系列openresty web 前端开发文章的实例demo,方便测试运行,喜欢请点↑↑↑右上角Star↑↑↑ 文章目录 openresty 前端开发进阶三之后端整合二 openresty 前端开发进阶四之session篇 openresty 前端...

    Vanilla是一个基于Openresty实现的高性能Web应用开发框架

    总之,Vanilla是一个为了简化Openresty使用而诞生的Web应用开发框架,它的目标是让开发者更容易地利用Openresty的高性能特性,快速构建健壮、高效的Web服务。通过使用Vanilla,开发者可以专注于业务逻辑,而不是底层...

    Python-Lor是一个运行在OpenResty上的基于Lua编写的Web框架

    Lor是一个运行在OpenResty上的基于Lua编写的Web框架.路由采用Sinatra风格,Sinatra是Ruby小而精的web框架.API基本采用了Express的思路和设计,Node.js跨界开发者可以很快上手.

    第一章 安装OpenResty(Nginx+Lua)开发环境

    利用Lua的轻量级特性,OpenResty可以提高Web应用的响应速度,同时降低了系统资源的消耗。 安装OpenResty主要包括以下几个步骤: 1. **系统准备**: 在开始安装前,确保你的系统是支持OpenResty的。这通常包括...

    openresty实践

    对于Web开发人员来说,Lua是一种轻量级的脚本语言,它易于学习且执行效率高。OpenResty通过与Lua的结合,为开发人员提供了强大的编程能力,让Nginx的功能更加灵活和动态。 在OpenResty中,Lua环境的搭建是入门的...

    OpenResty最佳实践

    OpenResty是一套基于Nginx和LuaJIT的高性能Web平台,它将Lua语言和Nginx模块化设计的优点...它为那些对Web前端开发、网关开发以及限流代理服务器开发感兴趣的读者提供了宝贵的指导,同时也为OpenResty社区做出了贡献。

    openresty 最佳实践

    Lua语言是一种轻量级的脚本语言,以其简洁、易读、高效等特点,在OpenResty中扮演着重要角色。Lua的环境搭建、基础数据类型、表达式控制结构、函数定义、模块化编程等都是开发OpenResty应用时需要熟练掌握的知识点。...

    一个运行在OpenResty上的基于lor编写的社区软件

    Lor,则是一个轻量级且高效的Node.js风格的Lua Web框架,使得开发工作更加便捷和高效。 【描述】: "一个运行在OpenResty上的基于lor编写的社区软件" 社区软件通常需要处理大量的用户交互、数据存储和实时通信,这...

    openresty.tar.gz

    对于中小型应用,OpenResty足以满足其需求,并且由于其轻量级和高度可定制的特性,也深受许多大型企业的青睐。通过学习和掌握OpenResty,开发者可以构建出高并发、低延迟的Web服务,提高系统的整体性能和稳定性。

    Developing OpenResty Framework USING DECOUPLED LIBRARIES.pdf

    最后,Aapo提到了Leaf Corcoran的Lapis框架,这是一个基于OpenResty的轻量级MVC框架,值得开发者参考和使用。 总的来说,OpenResty通过解耦的库提供了一种高效、可扩展的方式来构建Web应用程序。其灵活性、性能和对...

    thinklua:一个lua Web MVC框架一个基于openresty的web框架

    ThinkLua 是一个专为Lua设计的Web MVC(模型-视图-控制器)框架,它基于OpenResty,充分利用了OpenResty在Lua与Nginx集成的强大能力,为开发高性能、轻量级的Web应用提供了便捷的工具。OpenResty自身集成了Nginx ...

    openresty, 轻量 OpenResty Docker 映像.zip

    openresty, 轻量 OpenResty Docker 映像 OpenResty Docker 图像这个存储库包含Dockerfiles的ficusio/openresty 图像,它有两种。口味最主要的是 Alpine linux -based ficusio/openresty:latest

    OpenResty开发最佳实践pdf

    通过揉和众多设计良好的 Nginx 模块,OpenResty 有效地把 Nginx 服务器转变为一个强大的 Web 应用服务器,基于它开发人员可以使用 Lua 编程语言对 Nginx 核心以及现有的各种 Nginx C 模块进行脚本编程,构建出可以...

    《OpenResty最佳实践》 .pdf

    Lua是一种轻量级的脚本语言,被广泛用于嵌入到应用程序中提供灵活的扩展和定制功能。在OpenResty中,Lua用来编写动态Web应用的业务逻辑。 - **Lua环境搭建**:首先需要在系统中搭建Lua运行环境,以便开始Lua编程的...

    基于OpenResty的百万级长连接推送.pdf

    OpenResty是一种基于Nginx的开源Web服务器软件,它提供了强大的Web开发和部署能力。基于OpenResty的百万级长连接推送系统设计,需要解决高并发、大规模连接和实时推送等挑战。下面是基于OpenResty的百万级长连接推送...

    OpenResty1.25版本安装包

    总之,OpenResty 1.25.3.1是一个强大的Web开发框架,它融合了Nginx的高性能和Lua的灵活性,为构建高性能、高并发的Web应用提供了理想平台。通过深入了解和熟练使用OpenResty,开发者可以实现高效、可扩展的服务架构...

Global site tag (gtag.js) - Google Analytics