Docs for Sener
MIT License
sener
| | | | | | |:--:|:--:|:--:|:--:| | router | | | 0.0.14 | | cookie | | cookie | 0.0.14 | | session | | session[cookie] | 0.0.14 | | cors | | | 0.0.14 | | env | | | 0.0.15 | | ip-monitor | | ip | 0.0.15 | | validator | | | 0.0.15 | | json | | json | 0.0.14 | | static | | | 0.0.14 | | form | | formdata | 0.0.14 | | config | | | 0.0.14 | | log | | | 0.0.14 | | mysql | | mysql | 0.0.14 | | mongodb | | mongodbcollocation | 0.0.14 | | rpc | | x-trace-id | 0.0.14 |
npm i sener
demo:
import {Sener} from 'sener';
new Sener();
options:
new Sener({
port: 9000, // port: default value is 9000
middlewares: [], // Sener middlewares
});
npm i ebuild-cli -g
ebuild init <Project name>
cd <Project name>
npm i
sener
git clone https://github.com/theajack/sener-best-practice.git
import {Sener, Router} from 'sener';
const router = new Router({
'/demo': ({ query }) => {
// or: 'get:/demo': ({ query }) => { // get: prefix can be ignored
query.message = 'from get';
return { data: query };
// Custom headers or statusCode
// return { data: query, headers: {}, statusCode: 200 };
},
'post:/demo': async ({ body }) => {
body.message = 'from post'
return { data: body };
},
});
new Sener({
// router
middlewares: [router],
});
json
npm i sener sener-json
import {Sener, Router} from 'sener';
import {Json} from 'sener-json';
const router = new Router({
'/data': ({ query, read }) => {
// 'data' is json file name
return { data: read('data') };
},
'post:/data': async ({ body, write }) => {
const { data, save, id } = write('aa');
body.message = 'from post'
data.push({...body, id: id()}); // Add increment id
save(); // save it, THIS Method must be called
return { data };
},
});
new Sener({
middlewares: [router, new Json()],
});
new Json({
dir: '', // directory for save json files. default value is ''
format: false, // Whether to format the JSON file. Default value: The development environment is false and the production environment is true
})
npm i sener sener-cors
import {Sener, Cors} from 'sener';
new Sener({
middlewares: [new Cors()],
// new Cors(header); Or Set your custom headers
});
new Cors({
// headers: Set your custom headers
})
npm i sener sener-static
import {Sener} from 'sener';
import {Static} from 'sener-static';
new Sener({
middlewares: [new Static()],
// new Static({dir}); dir default value is ./public
});
new Static({
dir: './public', // Static directory, default value is ./public
})
form
npm i sener sener-form
import {Sener, Router} from 'sener';
import {Form} from 'sener-form';
const router = new Router({
'post:/upload': ({ formData, files }) => {
return { formData, files }
},
});
new Sener({
middlewares: [new Form(), router],
// new Form({dir}); dir default value is ./public
});
new Form({
dir: './public/upload', // File upload directory, default value is ./public/upload
})
npm i sener sener-log
import {Sener, Router} from 'sener';
import {Log} from 'sener-log';
const router = new Router({
'get:/test': ({ query, logger }) => {
logger.log('msg', 'payload')
return { data: query }
},
});
new Sener({
middlewares: [new Log(), router],
});
class Logger {
log(msg: string | IMessageData, payload?: any, type?: TLogType): void;
get traceid (): string;
refreshDurationStart(): void;
refreshTraceId(): void;
}
interface IMessageData {
msg?: string;
payload?: any;
type?: 'error' | 'log' | 'warn' | 'info';
level?: number;
extend?: object;
}
new Log({
dir: '' //
useConsole: false, // .log false
maxRecords: 10000, // 10000
level: -1, //
// level?: ()=>number //
})
JSON
npm i sener sener-config
import {Sener, Router} from 'sener';
import {Config} from 'sener-config';
const router = new Router({
'get:/test': ({ query, config, writeConfig, onConfigChange }) => {
const level = config.level;
level(); // read config
level(5); // write config
writeConfig('level', 5) // write config with writeConfig
onConfigChange(({key, value, prev}) => { // on config change
console.log(key, value, prev);
})
return { data: query }
},
});
const config = new Config();
// Use config instance
config.onConfigChange(({key, value, prev}) => { // on config change
console.log(key, value, prev);
});
config.data.level(); // read config
config.data.level(5); // write config
config.writeConfig('level', 2); // write config with writeConfig
new Sener({
middlewares: [config, router],
});
options
new Config({
dir: '', //
file: 'default', //
// file: ['c1', 'c2'], //
format: false, // JSON
})
mysql
npm i sener sener-mysql
import {Sener, Router} from 'sener';
import {Mysql} from 'sener-mysql';
const router = new Router({
'get:/test': async ({ query, querySql, mysqlConn }) => {
const { results, fields } = await querySql('select * from user');
// Or use mysqlConn
return { data: query }
},
});
const mysql = new Mysql({
// [mysql](https://www.npmjs.com/package/mysql)
}
mysql.connection;
new Sener({
middlewares: [mysql, router],
});
mongodb
npm i sener sener-mongodb
import {Sener, Router} from 'sener';
import {Mongo} from 'sener-mongodb';
const router = new Router({
'get:/test': async ({ query, queryMongoDB, mongoClient }) => {
const {db, close} = await queryMongoDB('user');
// do something
// Or use mongoClient
return { data: query }
},
});
const mongodb = new Mongo({
// [mongodb](https://www.npmjs.com/package/mongodb)
})
mongodb.client;
new Sener({
middlewares: [mongodb, router],
});
rpc
web
x-trace-id headertracidlog
npm i sener sener-rpc
import {Sener, Router} from 'sener';
import {RPC} from 'sener-rpc';
const router = new Router({
'get:/test': async ({ query, rpc }) => {
const list = rpc.comment.get('/message', {page: 1}); // url and query
// use rpc.comment.request for more details
return { data: {query, list} }
},
});
new Sener({
middlewares: [new RPC({
user: 'http://localhost:3000', // user base
comment: 'http://localhost:3001', // comment base
}), router],
});
import {Sener, Router} from 'sener';
import {RPC, Request} from 'sener-rpc';
class CommentRequest extends Request {
getList ({ app = 'common', index = 1 }: {
app?: string
index?: number
} = {}) {
return this.get('/message', {
app,
index,
size: 10,
});
}
}
function createServices(traceid = '') {
const base = (port: number) => `http://localhost:${port}`;
return {
comment: new CommentRequest({ base: base(3001), traceid }),
};
}
const router = new Router({
'get:/test': async ({ query, rpc }) => {
const list = rpc.comment.getList();
return { data: {query, list} }
},
});
new Sener({
middlewares: [new RPC(createServices), router],
});
npm i sener-rpc
import {WebRPC} from 'sener-rpc/dist/web.umd';
// 1. base
const comment = new WebRPC('http://localhost:3001');
await comment.get('/message', {page: 1});
// 2. map
const rpc = new WebRPC({
user: 'http://localhost:3000', // user base
comment: 'http://localhost:3001', // comment base
});
await rpc.comment.get('/message', {page: 1});
// 3.
class Comment extends WebRPC {
getList ({ app = 'common', index = 1 }: {
app?: string
index?: number
} = {}) {
return this.get('/message', {
app,
index,
size: 10,
});
}
}
await (new Comment()).getList();
<script src='https://cdn.jsdelivr.net/npm/sener-rpc'></script>
<script>
SenerRpc.WebRPC
</script>
Sener ~/sener-data
let BASE_SENER_DIR = path.resolve(homedir(), './sener-data')
sener
Sener.Dir = 'xxxxx'
Sener.Version