##  Quick Start To Fkc Application Service Framework

[![NPM version][npm-v-2]][npm-url] 
[![NPM Install Size][size]][size-url] 
[![NPM Downloads][download]][download-url]
[![NPM License][license]][license-url]

**1. Install**

```shell
npm install fkc
```

**2. Create a Web**

```javascript
const fkc = require('fkc');
const app = fkc();
```

```javascript
const fs = require('fs');
const options = { 
    key: fs.readFileSync('./server.key'),
    cert: fs.readFileSync('./server.crt')
};
const domain = '127.0.0.1'; // or '*.xxx.com'
const web = app.host(domain,options); 
```

**3. Web add plug-in**
```javascript
web.arg('logs',(req,res)=>{
    return (d)=>{
        console.log(d);
    }
})
```

**4. Web add middleware**

```javascript
web.use((ctx)=>{
    console.log('use1');
    ctx.arg.logs('Add plug-in'); 
},(ctx)=>{
    console.log('use2');
    ctx.stop();   //Enable stop
}).use((ctx)=>{
    console.log('use3');
    // ctx.res.file = './demo/my.mp4';    // Download File
    // ctx.res.static = './demo/my.mp4';  // Static File
    const date = new Date();
    date.setTime(date.getTime() + (30 * 60 * 1000)); // Expires in 30 minutes
        ctx.res.setHeader("Access-Control-Allow-Origin","*"); 
    ctx.res.setHeader("Access-Control-Allow-Mothods","POST,GET,DELETE,HEAD");
    ctx.res.setHeader("Access-Control-Allow-Headers","Content-Type,X-Custom-Header")
    ctx.res.setHeader('Set-Cookie', `cookieName=cookieValue; Expires=${date.toUTCString()}; HttpOnly`);
    ctx.json = 'Hello World' //Request End
})
```


**5. Add Route /Cannot return**

```javascript
// Normal Mode
const opt = {
    KB:0.01,            //Data size
    err(e){             //error callback  
        console.log(e); //e:string|null
    }
}
const json = app.body.json();
const urlencoded = app.body.urlencoded(opt)
const raw = app.body.raw(opt)  //Other request bodies
const upload = app.body.upload({
    // kb:1024,         //One file size
    mb:1024,            //One file size
    // KB:1024*1024,    //Total file size    
    MB:1024*1024,       //Total file size
    dir:'./uploadDir',  //File upload directory
    err(e){             //error callback
        console.log(e);
    }
})
web.get('/upload',upload,(ctx)=>{
    console.log(ctx.req.file);     //Print File List
})
web.get('/',raw,json,urlencoded,(ctx)=>{
    ctx.msg = 'Hello';             //Assign value to "ctx.msg"
    console.log(ctx.req);          //Print Request Details
},(ctx)=>{
    console.log(ctx.msg);          //"Hello"
    console.log(ctx.req.body);     //Request body
    ctx.res.body = 'hello world！'; //Response content
    // ctx.res.code = 200;         //Response Code Default: 200
    // ctx.res.charset = "utf-8";  //Response charset Default: "utf-8"
    // ctx.res.type = "html";      //Response type Default: "txt"
})

//SSE Mode
web.get('/sse',(ctx)=>{
    const sse = ctx.sse;
    sse.open(30); //Heartbeat keepalive（default 30 seconds）
    sse.send('hello world！');
    sse.sends("eventName","I am sse")
    sse.close();
})

//Restful Mode
web.get('/:id/:age',()=>{
    // url: /10/18?sex=1
    console.log(ctx.msg); //Hello
    console.log(ctx.req.data); //{id:xxx,age:xxx,sex:1}
})

//Reg Mode.1
web.get('/html/*/*/',()=>{
    // url: /html/xxx/xxx/
    console.log(ctx.msg); //Hello
})
//Reg Mode.2
web.get(/^\/html\/[^\\/]+\/[^\\/]+\/$/,()=>{
    // url: /html/xxx/xxx/
    console.log(ctx.msg); //Hello
})


```

**6. File Mode**


```javascript
const Route = '/path';        // Add Route 
const filesDir = './file';    // File directory
// web.html(filesDir);        // Cache h5 files
// web.file(filesDir);        // Default route is'/'
// web.static(filesDir);      // Default route is'/'
web.html(Route,filesDir)      // Html  File     Route Mode: Normal     
web.file(Route,filesDir);     // Download File  Route Mode: Normal
web.static(Route,filesDir);   // Static File    Route Mode: Normal
```

**7. File Route /Cannot return**

```javascript
web.get('/api','./web');      //All Method
//  file:'./web/test.js'      route: /api/test
//  file:'./web/my/test.ts'   route: /api/my/test

// test.js code
'use strict';
exports.main = async(ctx) => {
    ctx.res.body = 'hello world！';
};

```

**8. Enable http/https service**

```javascript
app.http(80).https(443).cluster(3).end(()=>{
    console.log('Successfully opened');
});

// app.http(80)    //HTTP protocol port
// app.https(443)  //HTTPS protocol port
// app.cluster(3)  //Number of service clusters
// app.end()       //Function end must be used

```





[npm-v-1]: https://badgen.net/npm/v/fkc
[npm-v-2]: https://img.shields.io/npm/v/fkc
[npm-url]: https://www.npmjs.com/package/fkc
[size]: https://badgen.net/packagephobia/install/fkc
[size-url]: https://packagephobia.com/result?p=fkc
[download]: https://badgen.net/npm/dt/fkc
[download-url]: https://npmcharts.com/compare/fkc?minimal=true
[license]:https://badgen.net/npm/license/fkc
[license-url]:https://npmmirror.com/package/fkc/files/LICENSE