# liteserver

Latest version **0.3.0** (published 2013-06-07) · 0 weekly downloads

## Install

```sh
npm install liteserver
pnpm add liteserver
yarn add liteserver
bun add liteserver
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.3.0 |
| Published | 2013-06-07 |
| First published | 2012-04-08 |
| Weekly downloads | 0 |
| TypeScript types | none |
| Module format | CommonJS |
| Node | >0.6.10 |
| Dependencies | 3 |
| Known vulnerabilities | 0 (+1 in 1 direct dependencies) |
| Install scripts | no |
| Author | fish |
| Maintainers | fish, ytrusty |

## Links

- npm: https://www.npmjs.com/package/liteserver
- npm.io page: https://npm.io/package/liteserver

## Dependencies (3)

- [cookie](https://npm.io/package/cookie.md) 0.0.5
- [liteview](https://npm.io/package/liteview.md) 0.2.4
- [formidable](https://npm.io/package/formidable.md) 1.0.13

## Recent versions

- 0.3.0 (latest) — 2013-06-07
- 0.2.9 — 2013-06-04
- 0.2.8 — 2013-05-15
- 0.2.7 — 2013-04-18
- 0.2.6 — 2013-03-20
- 0.2.5 — 2013-02-22
- 0.2.4 — 2013-01-27
- 0.2.3 — 2013-01-08
- 0.2.2 — 2012-12-03
- 0.2.1 — 2012-11-28
- 0.2.0 — 2012-11-21
- 0.1.9 — 2012-11-20
- 0.1.8 — 2012-11-12
- 0.1.7 — 2012-11-10
- 0.1.5 — 2012-11-10
- … 15 more at https://npm.io/package/liteserver/versions

## README

## liteserver 

    liteserver 是一个轻量级的http服务器。
    liteserver 扩展了 request对象，response对象，使得编写web应用更简单。
    
    liteserver集成了常用的http输入接口（get，post，cookie）和输出接口(模板引擎、json输入，jsonp输出)
    程序则关心控制的编写即可
    
    liteserver可方便的结合cluster使用，以创建多进程服务

## 使用方法

#### 安装模块
  
    npm install liteserver

#### 编写控制器
    
    每个控制器接收三个参数: request response config

    function index(req,res,config){ // 每个控制器，接收三个
      var router = req.getRouter();
      console.log(router);
    }
    exports = module.exports = index;

#### 编写服务index.js 

    var LiteServer = require('liteserver');
    var Log = LiteServer.Log;
    var serv = LiteServer.create(cfg);  // cfg 参考config配置一节
    var controller = serv.loadController(path); // 从path路径加载控制器，path下所有的js文件，以及目录
    serv.router({
      '/index' : controller.index,
      '/favicon' : serv.favicon(icopath),
      '/custom':function(req,res,cfg){
        // 快速定义一枚controller 
      }
    }).view({
      constant : {js : 'http://static.abc/js'}
      compress : true, // compress output html
      debug:debug, // true or false 
    }).start(function(err){
      if(err){
        console.log(err);
      }else{
        console.log('server start!');
      }
    });

## config 配置

    config对象

    {
      root: string 服务所在的路径 ，加载控制器、模板等等，都依赖此路径
      port: string 服务端口，目前只支持单个端口的绑定。多端口暂不考虑
      tpl: path 模板存放地址，相对于root的地址或者绝对地址，注意path "/"开头,表示绝对地址
      debug: bool 是否调试状态
    }

    配置模板引擎

    serv.setView(viewObject); // viewObject 必须实现 render('tpl',{obj}) 方法

    配置路由解析器

    serv.setRouter(function(){
      // TODO your own router parser
    })

    配置 filter, filter在router之前执行，相当于入户的电表开关，可以控制访问权限
    serv.filter(function (req, res, config, next) {
      // if allow
    });
    配置log模块, 两组log文件，不同的log等级，按天切分

    Log.create({
      sys : {
        file : './logs/test.%year%-%month%-%day%.log',
        level : 'DEBUG',
        duration : 4
      },
      login : {
        file : './logs/test.%year%-%month%-%day%.log',
        level : 'WARN',
        duration : 4
      }
    });

## 路由规则

    http://domain/controller/action/param[0]/param[1]/param[...]
    上面可以看出，所有的请求路径都被映射成controller、action、param三部分
    通过req.getRouter()获得这个router对象
    某些情况，用户请求地址到controller，则会有默认的action响应，这由controller来控制
    action往下的路由是自由的，controller自行控制
    
    var router = req.getRouter()
    
## req对象的扩展

    var router = req.getRouter()  // 获取路由信息
    var get = req.getQuery()      // 获取get参数，注意数据值没有decodeURIComponent()过，按需处理
    var cookie = req.getCookie()  // 获取cookie，注意数据值没有decodeURIComponent()过，按需处理
    
    req.getPost(function(err, post, files){   // 获取简单post的数据，回调函数的形式
      console.log(post);
    });
    
    req.on('post',function(err, post, files){  // 获取简单post的数据，事件形式
      console.log(post);
    });
    req.getPost();
    
    req.dispatch(actionName, {
      // req分发请求动作，有actionName来指定调用的具体的action方法，注意action方法$开头
      $default : function (req, res, config) {
        // $default 方法必须有
      },
      $test : function (req, res, config) {

      }
    }); 
    
## res对象的扩展

    res.render(tpl, obj)     // 渲染模板，tpl为模板文件相对地址（相对模板的目录），obj为模板中的变量，注意这里直接res.end()了
    res.setCookie(name, value, option) // 设置cookie,  option为对象{expires,path,domain,httponly}
    res.redirect(path)      // path == string 为 302 ， path为router对象，则直接在服务器端跳转至相应的controller.action
    res.json(obj)           // json输出，注意这里直接 res.end()了，不能再继续http输出
    res.jsonp(cb, obj)       // jsonp格式输出，注意这里直接res.end()了，不能再有http输出
    res.gzip(obj)           // gzip输出, 支持 obj 为 Object(自动JSON输出) 或者 String ,stream模式需自行编写

## 自定义错误返回
    
    目前支持两种错误自定义
    当controller没找到时：
      404 handler将被触发；
    当controller执行过程中，发生意外的时候：
      500 handler将被触发；

    注册错误handler
    serv.router({
      '500' : function (req, res, config) {
        var err = req.error; // get error object
        // TODO handle error
      },
      '404' : function (req, res, config) {

      }
    });

## log日志系统
    
    var log = require('liteserver').Log.create({
      sys : {
        file : './logs/test.%year%-%month%-%day%.log',  // 支持按天、月、年分割
        level : 'DEBUG', // can be DEBUG|INFO|TRACE|WARN|ERROR|FATAL|OFF
        duration : 4
      },
      login : {
        file : './logs/test.%year%-%month%-%day%.log',
        level : 'WARN',
        duration : 4
      },
      std : {           // without file, log will write to process.stdout by default 
        level : 'DEBUG' 
      }
    });

    log对象包含以下方法：
        log.debug(msg)
        log.trace(msg)
        log.info(msg)
        log.warn(msg)
        log.error(msg)
        log.fatal(msg)

#### 测试

    mocha test --coverage

---
_Source: https://npm.io/package/liteserver · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
