lua-resty-router
Elegant, performant and productive router for Openresty
$ opm get xiangnanscu/lua-resty-router
lua-resty-router
Elegant, performant and productive router for Openresty.
Quick Start
It's recommended to use npm to scaffold a lua-resty-router project.
npm create resty-app@latest
Then follow the instructions to complete the project.
Api
new
(method) Router:new()
-> Router
create a router.
insert
(method) Router:insert(path: string, handler: string|function, methods?: string|string[])
-> Router
insert a route.
extend
---@alias Route {[1]:string, [2]:function|string, [3]?:string|string[]}
(method) Router:extend(routes: Route[])
-> Router
insert routes to a router.
match
(method) Router:match(path: string, method: string)
-> string|function
2. { [string]: string|number }?
match a http request
Synopsis
local Router = require('resty.router')
local router = Router:new()
local cnt = 0
local error_cnt = 0
-- Test events
router:on('add', function(ctx)
cnt = cnt + 1
end)
router:on('error', function(ctx)
error_cnt = error_cnt + 1
end)
-- Test plugins
router:use(function(ctx)
ctx.cnt = cnt
ctx.error_cnt = error_cnt
end)
-- 1. Test static path
router:get("/hello", function()
return "Hello World"
end)
-- Test custom success status code
router:get("/hello-201", function()
return "Hello World", 201
end)
-- 2. Test JSON response
router:get("/json", function()
return { message = "success", code = 0 }
end)
-- 3. Test dynamic path parameters
router:get("/users/#id", function(ctx)
return {
id = ctx.params.id,
type = type(ctx.params.id)
}
end)
router:get("/users/:name", function(ctx)
return {
name = ctx.params.name,
type = type(ctx.params.name)
}
end)
-- 4. Test regex path
router:get([[/version/<ver>\d+\.\d+]], function(ctx)
return {
version = ctx.params.ver
}
end)
-- 5. Test wildcard
router:get("/files/*path", function(ctx)
return ctx.params.path
end)
-- 6. Test other HTTP methods
router:post("/accounts", function(ctx)
return { method = "POST" }
end)
router:put("/accounts/#id", function(ctx)
return { method = "PUT", id = ctx.params.id }
end)
-- 7. Test error handling
router:get("/error", function()
error("Test Error")
end)
-- Test custom error thrown by error()
router:get("/custom-error", function()
error({ code = 400, message = "Custom Error" })
end)
-- Test error in the form of return nil, err, code
router:get("/return-error", function()
return nil, "Parameter Error", 402
end)
-- Test handled error
router:get("/handled-error", function()
error { "handled error" }
end)
-- 8. Test status code
router:get("/404", function()
return nil, "Not Found", 404
end)
-- 9. Test HTML response
router:get("/html", function()
return "<h1>Hello HTML</h1>"
end)
-- Test HTML error
router:get("/html-error", function()
return nil, "<h1>Hello HTML error</h1>", 501
end)
-- Test HTML error thrown by error()
router:get("/html-error2", function()
error { "<h1>Hello HTML error2</h1>" }
end)
-- 10. Test function return
router:get("/func", function(ctx)
return function()
ngx.header.content_type = 'text/plain; charset=utf-8'
ngx.say("function called2")
end
end)
-- 11. Check if events are executing properly
router:get("/add", function(ctx)
router:emit('add')
return ctx.cnt
end)
router:get("/events", function(ctx)
return ctx.cnt
end)
return router
reference
Authors
Nan Xiang(@xiangnanscu)
License
mit
Versions
-
Elegant, performant and productive router for Openresty 2024-12-05 04:24:25
-
Elegant, performant and productive router for Openresty 2024-12-05 04:23:31
-
Elegant, performant and productive router for Openresty 2024-12-04 14:39:12
-
Elegant, performant and productive router for Openresty 2024-12-04 14:34:29
-
high performance router 2024-03-17 16:37:31
-
high performance router 2024-03-17 10:13:36
-
high performance router 2024-03-15 08:42:05
-
high performance router 2024-01-25 16:57:30
-
high performance router 2024-01-25 12:59:45
-
high performance router 2023-10-01 02:17:45
-
simple case sensitive router 2018-03-22 17:03:03
-
simple case sensitive router 2018-03-22 16:54:00