hanxi / blog

涵曦的博客
https://blog.hanxi.cc
56 stars 5 forks source link

学习alilua - 制作快餐点餐工具 #4

Open hanxi opened 9 years ago

hanxi commented 9 years ago

一、搭建环境

参考: http://alilua.com/docs.html

下载和编译alilua

$ git clone https://github.com/oneoo/alilua.git
$ cd alilua
$ make

设定网站目录

这是调整后的目录,将alilua作为子工程放入工程目录。

project/
├── alilua/             # alilua源码目录
├── css/
├── js/
├── scripts/            # lua脚本目录
│   ├── index.lua
│   └── upload.lua
├── template/           # html模板目录
│   └── index.html
├── restart.sh          # 快速重启脚本
├── route.lua           # alilua路由脚本
├── host-route.lua      # alilua路由配置
└── uploaddir/          # 上传文件目录

快速重启脚本(方便快速调试)

stop()
{
    pid=`ps -ef| grep "alilua" | grep -v grep | awk '{print $2}' `
    if [ "$pid"x != x ]; then
        kill -9 $pid
        echo "stop alilua"
    fi
}

参考:https://github.com/oneoo/alilua/issues/27

因为 require 过程中产生的 Lua 运行环境不是一个协程,所以会报 attempt to yield across C-call boundary 错误。

你把 require 改为 dofile 就可以运行的。

  • 如果非要使用require,则需要在 db.lua 里面把数据库操作封装成 function ,再给调用者使用。我用的是这种方式。

    文件上传的实现

  • 不想用 alilua 示例中那个 form 的例子的实现方式(标准的 html post 请求方式)
  • 我采用 AJAX 实现 post 请求传文件内容, url 参数中传文件名的方式实现。
  • AJAX 发送 post 请求遇到 sendAsBinary 函数在谷歌浏览器被移除的问题。
  • 谷歌一搜就有解答
if(!xhr.sendAsBinary){
    xhr.sendAsBinary = function(datastr) {
        function byteValue(x) {
            return x.charCodeAt(0) & 0xff;
        }
        var ords = Array.prototype.map.call(datastr, byteValue);
        var ui8a = new Uint8Array(ords);
        this.send(ui8a.buffer);
    }
}

源代码在这里:https://github.com/hanxi/alilua-demo-ordering

在此感谢alilua的作者oneoo在百忙之中抽空帮助我解答疑问