前面介绍FormInputNginxModule模块时,明白了openresty如何获取post提交的数据。
然后,如果需要通过lua处理这些数据,需要把数据作为参数传递到lua中,lua获取了这些数据,又会将结果返回到nginx内,从而完成整个流程。
首先,有post请求:
1 var json = { 2 data: "Hello!" 3 }; 4 $.post( 5 ‘save‘, 6 json, 7 function(callback){ 8 alert(callback); 9 } 10 );
然后是nginx的相关配置:
1 user root; 2 worker_processes 2; 3 4 error_log logs/error.log; 5 pid logs/nginx.pid; 6 7 events { 8 worker_connections 1024; 9 # multi_accept on; 10 } 11 12 http { 13 include mime.types; 14 15 access_log logs/access.log; 16 17 server { 18 listen 80; 19 server_name localhost; 20 21 location / { 22 root /var/www/aceEditor; 23 index index.htm index.html; 24 } 25 26 location /save { 27 set_form_input $data data; 28 echo $data; 29 } 30 } 31 }
在介绍FormInputNginxModule模块时,我们看到这个配置通过set_form_input方法获取了post提交的data数据,并成功的将结果返回给了前台。
现在,需要处理post上来的data数据,所以我们将data作为一个参数,传递到lua代码中,通过lua代码来处理这些数据,并且需要将结果返回给nginx。
这里,更改nginx.conf的26~29行的配置:
1 location /save { 2 set_form_input $data data; 3 set_by_lua $re ‘ 4 local s = "张!!!" 5 return ngx.arg[1] .. s; 6 ‘ $data; 7 echo $re; 8 }
其中,set_by_lua方法:
语法:set_by_lua $res <lua-script-str> [$arg1 $arg2 ...]
作用:将参数列表传递到lua内,并且将lua的返回值赋值给res变量。
在这里,set_by_lua方法将data作为参数传递到了lua代码内,在lua内通过ngx.arg[n]获取了这个参数,经过处理后将结果返回给了nginx,然后该结果赋值给了变量re,nginx再将re返回给了前台。ngx.arg[n]内的n表示传递参数的顺序。
看看效果:
我们看到,前台正确的获取了nginx传递来的通过lua处理的结果数据。
如果需要将lua代码独立出来,则可以使用set_by_lua_file方法。
于是有lua文件m.lua:
1 local s = "张!asdsd!!" 2 return ngx.arg[1] .. s;
再将上面的配置更改为:
1 location /save { 2 set_form_input $data data; 3 set_by_lua_file $re /var/www/aceEditor/m.lua $data; 4 echo $re; 5 }
看看结果:
时间: 2024-10-26 03:08:21