├── core
├── cachesystem
│ ├── caches
│ │ ├── MemoryCache.js
│ │ └── RedisCache.js
│ └── CacheFactory.js
├── errors
│ └── error_404.ejs
├── Constant.js
├── Common.js
├── Cache.js
├── view-engine
│ ├── engine.js
│ └── engine
│ │ └── ejsEngine.js
├── Record.js
├── dbdriver
│ ├── Driver.js
│ └── drivers
│ │ └── MysqlDriver.js
├── Controller.js
├── Brown.js
├── View.js
├── Router.js
├── DB.js
└── Exception.js
├── .babelrc
├── app
├── view
│ ├── footer.ejs
│ ├── head.ejs
│ ├── index.ejs
│ └── header.ejs
├── config
│ └── config.js
├── model
│ └── User.js
└── controller
│ ├── AdminController.js
│ └── IndexController.js
├── index.js
├── package.json
├── test
├── dbTest.js
└── npm-debug.log
└── README.md
/core/cachesystem/caches/MemoryCache.js:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/core/cachesystem/caches/RedisCache.js:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/core/errors/error_404.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 | <%= msg %>
4 |
5 |
--------------------------------------------------------------------------------
/core/Constant.js:
--------------------------------------------------------------------------------
1 | var Constant = {
2 | "template-engine": "ejs"
3 | };
4 | export default Constant;
--------------------------------------------------------------------------------
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "es2015",
4 | "react",
5 | "stage-2"
6 | ],
7 | "plugins": []
8 | }
--------------------------------------------------------------------------------
/app/view/footer.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 | © Copyright 2017 The Awesome People
--------------------------------------------------------------------------------
/core/Common.js:
--------------------------------------------------------------------------------
1 | exports.firstUpperCase = function (str) {
2 | return str.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase());
3 | }
--------------------------------------------------------------------------------
/core/Cache.js:
--------------------------------------------------------------------------------
1 | import CacheFactory from './cachesystem/CacheFactory.js'
2 | /**
3 | * DB 直接操作类 跟Record配合使用
4 | */
5 | class Cache{
6 | }
7 |
8 | export default Cache;
--------------------------------------------------------------------------------
/app/config/config.js:
--------------------------------------------------------------------------------
1 | var config = {
2 | 'db':{
3 | 'driver':'mysql',
4 | 'db_name':'testbrown',
5 | 'host':'127.0.0.1',
6 | 'user':'root',
7 | 'password':'112358',
8 | 'pool':true
9 | }
10 | }
11 |
12 | export default config;
--------------------------------------------------------------------------------
/app/model/User.js:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * User表
4 | */
5 | class User extends Model{
6 | constructor(){
7 | this.tableName = 'user'; //如不修改默认为类名
8 | }
9 |
10 | //验证
11 | verify(req){
12 |
13 | }
14 | }
15 |
16 | export default User;
--------------------------------------------------------------------------------
/app/view/head.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Super Awesome
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | /**
2 | * BrownJs
3 | *
4 | * @author SevensChan
5 | *
6 | **/
7 | import Brown from './core/Brown.js'
8 |
9 | /**
10 | * Server Config
11 | **/
12 | const HTTP_IP = '127.0.0.1';
13 | const HTTP_PORT = 8899;
14 | var brown = new Brown();
15 | brown.listen(HTTP_PORT,HTTP_IP);
16 | brown.set("view engine","ejs");
--------------------------------------------------------------------------------
/core/view-engine/engine.js:
--------------------------------------------------------------------------------
1 | //引擎缓存
2 | let Engines = {};
3 |
4 | class Engine{
5 | static createEngine(engineType){
6 | if (Engines[engineType]){
7 | return Engines[engineType];
8 | }
9 | var engineClass = require('./engine/'+engineType+'Engine.js');
10 | Engines[engineType] = new engineClass['default']();
11 | return Engines[engineType];
12 | }
13 | }
14 |
15 | export default Engine;
--------------------------------------------------------------------------------
/core/cachesystem/CacheFactory.js:
--------------------------------------------------------------------------------
1 | //缓存
2 | let caches = [];
3 | class CacheFactory{
4 | static getCache(){
5 | var cacheType = Brown.getInstance().get('db').driver;
6 | if (caches[cacheType]){
7 | return caches[cacheType];
8 | }
9 | var cacheTypeClass = require('./caches/'+firstUpperCase(cacheType)+'Cache.js');
10 | caches[cacheType] = new cacheTypeClass['default']();
11 | return caches[cacheType];
12 | }
13 | }
14 |
15 | export default CacheFactory;
--------------------------------------------------------------------------------
/core/Record.js:
--------------------------------------------------------------------------------
1 | class Record{
2 |
3 | constructor(){
4 | this.columns = {};
5 | return this;
6 | }
7 |
8 | set(key,val){
9 | //方面插入数据库
10 | this.columns[key] = val;
11 | return this;
12 | }
13 |
14 | get(key){
15 | return this.columns[key];
16 | }
17 |
18 | foreach(func){
19 | for(var i in this.columns){
20 | func(i,this.columns[i]);
21 | }
22 | }
23 |
24 | toString(){
25 | console.log(this.columns);
26 | }
27 |
28 | }
29 | export default Record;
--------------------------------------------------------------------------------
/core/view-engine/engine/ejsEngine.js:
--------------------------------------------------------------------------------
1 | import ejs from 'ejs'
2 | import fs from 'fs'
3 | class ejsEngine{
4 | //render方法显示模板
5 | render(res,page,data){
6 | var body = ejs.renderFile(__dirname +'/../../../app/view/'+page,data,function(err,result){
7 | if (!err){
8 | res.writeHead(200, {
9 | 'Content-Type': 'text/html' });
10 | res.end(result);
11 | }else{
12 | res.end(err.toString());
13 | console.log(err);
14 | }
15 | });
16 | }
17 | }
18 | export default ejsEngine;
--------------------------------------------------------------------------------
/app/view/index.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | <% include head %>
7 |
8 |
9 |
10 |
11 | <% include header %>
12 |
13 |
14 |
15 |
16 |
<%= title %>
17 |
Welcome to templating using EJS
18 |
19 |
20 |
21 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/app/controller/AdminController.js:
--------------------------------------------------------------------------------
1 | import Controller from '../../core/Controller.js'
2 | import DB from '../../core/DB.js'
3 | import Record from '../../core/Record.js'
4 | class AdminController extends Controller{
5 | constructor() {
6 | super();
7 | this.view = super.view();
8 | }
9 |
10 | async index(){
11 | console.log('idnex');
12 | var result = await DB.findById("user",1,['id','name','age']);
13 | this.view.assign('title',result[0].name);
14 | this.view.display('index.ejs');
15 | }
16 | }
17 |
18 | export default AdminController;
--------------------------------------------------------------------------------
/core/dbdriver/Driver.js:
--------------------------------------------------------------------------------
1 | import {firstUpperCase} from '../Common.js'
2 | import Brown from '../Brown.js'
3 | //引擎缓存
4 | let drivers = {};
5 |
6 | class Driver{
7 | static getDB(){
8 | var dbdriver = Brown.getInstance().get('db').driver;
9 | if (typeof drivers[dbdriver] !== "undefined"){
10 | return drivers[dbdriver];
11 | }
12 | var dbdriverClass = require('./drivers/'+firstUpperCase(dbdriver)+'Driver.js');
13 | drivers[dbdriver] = new dbdriverClass['default']();
14 | return drivers[dbdriver];
15 | }
16 | }
17 |
18 | export default Driver;
--------------------------------------------------------------------------------
/app/view/header.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/core/Controller.js:
--------------------------------------------------------------------------------
1 | import View from './View.js'
2 | class Controller{
3 | constructor() {
4 | this.req = null;
5 | this.res = null;
6 | this.queryUrl = {};
7 | //设置view
8 | this.view = new View();
9 | }
10 |
11 | //设置request,response和请求参数
12 | setHttp(req,res,queryUrl){
13 | this.req = req;
14 | this.res = res;
15 | this.queryUrl = queryUrl;
16 | this.view.setRes(res);
17 | }
18 |
19 | //获取get请求的参数
20 | get(query){
21 | return this.queryUrl[query];
22 | }
23 |
24 | //获取post请求的参数
25 | post(query){
26 | //To Be Continue
27 | }
28 |
29 | //返回当前controller的view对象
30 | view(){
31 | return this.view;
32 | }
33 | }
34 |
35 | export default Controller;
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "brownjs",
3 | "version": "0.0.1",
4 | "description": "A cutie web framework base on node.js",
5 | "main": "index.js",
6 | "scripts": {
7 | "babel-node": "babel-node ",
8 | "dev": "nodemon --exec npm run babel-node -- index.js",
9 | "test": "mocha --require babel-core/register ./test/*.js"
10 | },
11 | "author": "SevensChan",
12 | "license": "MIT",
13 | "devDependencies": {
14 | "babel-cli": "^6.24.1",
15 | "babel-polyfill": "^6.23.0",
16 | "babel-preset-es2015": "^6.24.1",
17 | "babel-preset-react": "^6.24.1",
18 | "babel-preset-stage-2": "^6.24.1",
19 | "chai": "^3.5.0",
20 | "fs": "0.0.1-security",
21 | "mocha": "^3.3.0",
22 | "path": "^0.12.7",
23 | "should": "^11.2.1",
24 | "url": "^0.11.0",
25 | "webpack": "^2.5.1"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/core/Brown.js:
--------------------------------------------------------------------------------
1 | import http from 'http'
2 | import router from './Router.js';
3 | import fs from 'fs'
4 |
5 | let instance = null;
6 |
7 | class Brown{
8 |
9 | constructor(){
10 | if (!instance){
11 | instance = this;
12 | }
13 |
14 | //读取配置
15 | var config = require(__dirname+'/../app/config/config.js');
16 | this.config = config?config['default']:{};
17 |
18 | return instance;
19 | }
20 |
21 | static getInstance(){
22 | if (!instance){
23 | instance = new Brown();
24 | }
25 |
26 | return instance;
27 | }
28 |
29 | set(key,val){
30 | this.config[key] = val;
31 | }
32 |
33 | get(key){
34 | return this.config[key];
35 | }
36 |
37 | listen(port,ip){
38 | try{
39 | var server = http.createServer(function(req,res){
40 | router.handle(req,res);
41 | });
42 | server.listen(port,ip);
43 | console.log('Server Start Successfully');
44 | }catch(err){
45 | console.log(err);
46 | }
47 | }
48 | }
49 |
50 | export default Brown;
--------------------------------------------------------------------------------
/core/View.js:
--------------------------------------------------------------------------------
1 | import Brown from './Brown.js'
2 | import Engine from './view-engine/engine.js';
3 | /**
4 | * View 处理
5 | *
6 | **/
7 | class View{
8 | constructor(){
9 | this.res = null;
10 | this.engine = Engine.createEngine(Brown.getInstance().get('view engine'));
11 | }
12 |
13 | setRes(res){
14 | this.res = res;
15 | }
16 |
17 | output(str){
18 | const body = str.toString();
19 | this.res.writeHead(200, {
20 | 'Content-Type': 'text/html' });
21 | this.res.write(body);
22 | this.res.end();
23 | }
24 |
25 | setHeader(code,data){
26 | this.res.writeHead(code, data);
27 | }
28 |
29 | json(obj){
30 | const body = JSON.stringify(obj);
31 | this.res.writeHead(200, {
32 | 'Content-Type': 'text/json' });
33 | this.res.write(body);
34 | this.res.end();
35 | }
36 |
37 | display(path){
38 | this.engine.render(this.res,path,this.data);
39 | }
40 |
41 | assign(key,val){
42 | if (typeof this.data === "undefined")this.data = {};
43 | this.data[key] = val;
44 | }
45 | }
46 |
47 | export default View;
--------------------------------------------------------------------------------
/app/controller/IndexController.js:
--------------------------------------------------------------------------------
1 | import Controller from '../../core/Controller.js'
2 | import DB from '../../core/DB.js'
3 | import Record from '../../core/Record.js'
4 | class IndexController extends Controller{
5 | constructor() {
6 | super();
7 | this.view = super.view();
8 | }
9 |
10 | async index(){
11 | // var cl = super.get('cl');
12 | // super.view().output("Hello World! " + cl);
13 | // var user = new Record().set('name','Sevens').set('age',27);
14 | // user.toString();
15 | // var result = DB.save("user",user);
16 | // var result = DB.findAll("user",['name','age']);
17 | // super.view().output(result);
18 |
19 | var result = await DB.findById("user",1,['id','name','age']);
20 | this.view.assign('title',result[0].age);
21 | this.view.display('index.ejs');
22 | }
23 |
24 | show(){
25 | this.view.assign('title','Hello World');
26 | this.view.display('index.ejs');
27 | }
28 |
29 | about(){
30 | // this.view.assign('title','I am ABOUT');
31 | // this.view.display('index.ejs');
32 | var iamjson = {
33 | name: 'sevens',
34 | format: 'json'
35 | }
36 | this.view.json(iamjson);
37 | }
38 |
39 | async save(){
40 | var name = super.get('name');
41 | var age = super.get('age');
42 | var user = new Record().set('name',name).set('age',age);
43 | var insertId = await DB.save("user",user);
44 | this.view.assign('title',insertId);
45 | this.view.display('index.ejs');
46 | }
47 | }
48 |
49 | export default IndexController;
--------------------------------------------------------------------------------
/test/dbTest.js:
--------------------------------------------------------------------------------
1 | var poly = require('babel-polyfill');
2 | var expect = require('chai').expect;
3 | var should = require('chai').should();
4 | // var DB = require('../core/DB.js');
5 | import DB from '../core/DB.js';
6 | import Record from '../core/Record.js';
7 |
8 | describe('DB.js Testing', function() {
9 | //findById
10 | it('#findById()', function(done) {
11 | DB.findById("user",1,['id','name','age']).then(function(result){
12 | expect(result.name).to.be.equal('sevens');
13 | done();
14 | }).catch(function(err){
15 | console.log(err);
16 | });
17 | });
18 |
19 | it('#save()', function(done) {
20 | var name = Date.parse(new Date())+"";
21 | var age = 27;
22 | var user = new Record().set('name',name).set('age',age);
23 | DB.save("user",user).then(function(insertId){
24 | if (typeof insertId !== 'undefined'){
25 | DB.findById("user",insertId,['id','name','age']).then(function(result){
26 | expect(result.name).to.be.equal(name);
27 | done();
28 | }).catch(function(err){
29 | console.log(err);
30 | });
31 | }
32 | }).catch(function(err){
33 | console.log(err);
34 | });
35 | });
36 |
37 | it('#deleteById()', function(done) {
38 | var name = Date.parse(new Date());
39 | var age = 27;
40 | var user = new Record().set('name',name).set('age',age);
41 | DB.save("user",user).then(function(insertId){
42 | DB.deleteById("user",insertId).then(function(result){
43 | DB.findById("user",insertId,['id','name','age']).then(function(result){
44 | should.not.exist(result);
45 | done();
46 | }).catch(function(err){
47 | console.log(err);
48 | });
49 | }).catch(function(err){
50 | console.log(err);
51 | });
52 | }).catch(function(err){
53 | console.log(err);
54 | });
55 | })
56 | });
--------------------------------------------------------------------------------
/core/Router.js:
--------------------------------------------------------------------------------
1 | import url from 'url'
2 | import fs from 'fs'
3 | import qs from 'querystring';
4 | import {firstUpperCase} from './Common.js'
5 | import Exception from './Exception.js'
6 |
7 | //controller缓存
8 | let Controllers = [];
9 |
10 | exports.handle = function(req,res){
11 | req.requrl = url.parse(req.url,true);
12 | //请求参数
13 | var queryUrl = qs.parse(url.parse(req.url).query);
14 | //请求路径
15 | var path = req.requrl.pathname;
16 | //是否是静态文件
17 | if (/.(css)$/.test(path)){
18 | res.writeHead(200,{
19 | 'Content-Type': 'text/css'
20 | });
21 | fs.readFile(__dirname+path,'utf8',function(err,data){
22 | if (err) throw err;
23 | //输出静态文件
24 | res.write(data,'utf8');
25 | res.end();
26 | })
27 | }else if (/.(ico)$/.test(path)){
28 |
29 | }else{
30 | //读取请求的controller、action
31 | var controller = queryUrl['cl'];
32 | var action = queryUrl['ac'];
33 |
34 | var controllerClass;
35 | var controllerObj;
36 |
37 | //如果没有指定controller、action 默认为index
38 | if (typeof controller === "undefined"){
39 | controller = 'index';
40 | }
41 |
42 | if (typeof action === "undefined"){
43 | action = 'index';
44 | }
45 |
46 | try{
47 | //是否有缓存
48 | // console.log("controller:" + controller + " action: " + action);
49 | if (Controllers[firstUpperCase(controller)]){
50 | controllerObj = Controllers[firstUpperCase(controller)];
51 | }else{
52 | //没有缓存读取controller
53 | controllerClass = require('../app/controller/'+firstUpperCase(controller)+'Controller.js');
54 | controllerObj = new controllerClass['default']();
55 | Controllers[firstUpperCase(controller)] = controllerObj;
56 | }
57 | //设置request,response和请求参数
58 | controllerObj.setHttp(req,res,queryUrl);
59 | //判断action是否存在
60 | if (!controllerObj[action]){
61 | // console.log('不存在');
62 | new Exception(controllerObj.view).show_404();
63 | return;
64 | }
65 | //执行action方法
66 | controllerObj[action]();
67 | }catch(err){
68 | console.log(err);
69 | }
70 | }
71 | }
--------------------------------------------------------------------------------
/core/DB.js:
--------------------------------------------------------------------------------
1 | import driver from './dbdriver/Driver.js'
2 | require("babel-polyfill");
3 | /**
4 | * DB 直接操作类 跟Record配合使用
5 | */
6 | class DB{
7 | /**
8 | * 插入数据
9 | * @param {String} table 表名称
10 | * @param {Record} record 操作记录
11 | * @return {int} 插入状态
12 | */
13 | static async save(table,record){
14 | var db = driver.getDB();
15 | try{
16 | var result = await db.save(table,record);
17 | }catch(err){
18 | console.log(err);
19 | }
20 | return new Promise(function(resolve,reject){
21 | // console.log("DB.js : " + result);
22 | resolve(result);
23 | });
24 | }
25 |
26 | /**
27 | * 根据ID删除指定记录
28 | * @param {String} table 表名称
29 | * @param {int} id 删除的ID
30 | * @return {int} 删除状态
31 | */
32 | static async deleteById(table,id,id_name){
33 | var db = driver.getDB();
34 | var result = await db.deleteById(table,id,id_name);
35 | return new Promise(function(resolve,reject){
36 | // console.log(resolve);
37 | resolve(result[0]);
38 | });
39 | }
40 |
41 | /**
42 | * 根据ID查找记录
43 | * @param {String} table 操作表名称
44 | * @param {int} id 查找的id
45 | * @param {Array|String} fields 查找的列
46 | * @param {String} id_name id的列名,默认为'id'
47 | * @return {Object}
48 | */
49 | static async findById(table,id,fields,id_name){
50 | var db = driver.getDB();
51 | var result = await db.findById(table,id,fields,id_name);
52 | return new Promise(function(resolve,reject){
53 | resolve(result[0]);
54 | });
55 | }
56 |
57 | static update(table,id,record){
58 |
59 | }
60 |
61 | static findByCache(){
62 |
63 | }
64 |
65 | /**
66 | * Sql 查找
67 | * @param {String} sql
68 | * @return {Array} record集
69 | */
70 | static find(sql){
71 |
72 | }
73 |
74 | /**
75 | * 查找表的所有数据
76 | * @param {String} table 表名
77 | * @param {Array} fields 列
78 | * @return {Array} record集
79 | */
80 | static async findAll(table,fields){
81 | var db = driver.getDB();
82 | var result = await db.findAll(sql);
83 | return new Promise(function(resolve,reject){
84 | resolve(result[0]);
85 | });
86 | }
87 | }
88 |
89 | export default DB;
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | #Brownjs
2 | Fast, interesting, stable web framework for [node](http://nodejs.org).
3 |
4 | [![NPM Version][npm-image]][npm-url]
5 | [![NPM Downloads][downloads-image]][downloads-url]
6 | [![Linux Build][travis-image]][travis-url]
7 | [![Windows Build][appveyor-image]][appveyor-url]
8 | [![Test Coverage][coveralls-image]][coveralls-url]
9 |
10 | ```js
11 | import Brown from './core/Brown.js'
12 |
13 | const HTTP_IP = '127.0.0.1';
14 | const HTTP_PORT = 8899;
15 | var brown = new Brown();
16 | brown.listen(HTTP_PORT,HTTP_IP);
17 | ```
18 |
19 | ## Introduction
20 |
21 | Are you a PHP big fans and prefer the coding style like Codeigniter framework or ThinkPHP framework? Are you feel confuse while using express or koa? Too free to lost the norm. So this is why we need brownjs. Brownjs studies from Codeigniter and JFinal framework. And make development more comfortable.
22 |
23 | ## Installation
24 |
25 | #####Git or download project.
26 |
27 | ## Features
28 |
29 | * Auto setting routing
30 | * Easy way for processing db data
31 |
32 |
33 | ## Quick Start
34 |
35 | The quickest way to get started with brown is downloading the current project.
36 |
37 | ```bash
38 | $ npm install
39 | ```
40 |
41 | ## Document
42 |
43 | Working for it.
44 |
45 | ## License
46 |
47 | [MIT](LICENSE)
48 |
49 | [npm-image]: https://img.shields.io/npm/v/brown.svg
50 | [npm-url]: https://npmjs.org/package/brown
51 | [downloads-image]: https://img.shields.io/npm/dm/brown.svg
52 | [downloads-url]: https://npmjs.org/package/brown
53 | [travis-image]: https://img.shields.io/travis/brownjs/brown/master.svg?label=linux
54 | [travis-url]: https://travis-ci.org/brownjs/brown
55 | [appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/brown/master.svg?label=windows
56 | [appveyor-url]: https://ci.appveyor.com/project/dougwilson/brown
57 | [coveralls-image]: https://img.shields.io/coveralls/brownjs/brown/master.svg
58 | [coveralls-url]: https://coveralls.io/r/brownjs/brown?branch=master
59 | [gratipay-image-visionmedia]: https://img.shields.io/gratipay/visionmedia.svg
60 | [gratipay-url-visionmedia]: https://gratipay.com/visionmedia/
61 | [gratipay-image-dougwilson]: https://img.shields.io/gratipay/dougwilson.svg
62 | [gratipay-url-dougwilson]: https://gratipay.com/dougwilson/
--------------------------------------------------------------------------------
/core/Exception.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Exceptions Class
3 | *
4 | * @package CodeIgniter
5 | * @subpackage Libraries
6 | * @category Exceptions
7 | * @author EllisLab Dev Team
8 | * @link http://codeigniter.com/user_guide/libraries/exceptions.html
9 | */
10 | class Exception {
11 | /**
12 | * Constructor
13 | */
14 | constructor(view){
15 | this.view = view;
16 | }
17 |
18 | // --------------------------------------------------------------------
19 |
20 | /**
21 | * 404 Page Not Found Handler
22 | *
23 | * @access private
24 | * @param string the page
25 | * @param bool log error yes/no
26 | * @return string
27 | */
28 | show_404(page = '', log_error = true)
29 | {
30 | var heading = "404 Page Not Found";
31 | var message = "The page you requested was not found.";
32 |
33 | this.show_error(heading, message, 'error_404', 404);
34 | }
35 |
36 | // --------------------------------------------------------------------
37 |
38 | /**
39 | * General Error Page
40 | *
41 | * This function takes an error message as input
42 | * (either as a string or an array) and displays
43 | * it using the specified template.
44 | *
45 | * @access private
46 | * @param string the heading
47 | * @param string the message
48 | * @param string the template name
49 | * @param int the status code
50 | * @return string
51 | */
52 | show_error(heading, message, template = 'error_general', status_code = 500)
53 | {
54 | this.set_status_header(status_code);
55 |
56 | message = '' + ((! Array.isArray(message)) ? message : message.join(',')) + '
';
57 |
58 | this.view.assign('msg',message);
59 | this.view.display('../../core/errors/'+template + '.ejs');
60 | }
61 |
62 | set_status_header(code = 200, text = '')
63 | {
64 | var stati = {
65 | 200 : 'OK',
66 | 201 : 'Created',
67 | 202 : 'Accepted',
68 | 203 : 'Non-Authoritative Information',
69 | 204 : 'No Content',
70 | 205 : 'Reset Content',
71 | 206 : 'Partial Content',
72 |
73 | 300 : 'Multiple Choices',
74 | 301 : 'Moved Permanently',
75 | 302 : 'Found',
76 | 304 : 'Not Modified',
77 | 305 : 'Use Proxy',
78 | 307 : 'Temporary Redirect',
79 |
80 | 400 : 'Bad Request',
81 | 401 : 'Unauthorized',
82 | 403 : 'Forbidden',
83 | 404 : 'Not Found',
84 | 405 : 'Method Not Allowed',
85 | 406 : 'Not Acceptable',
86 | 407 : 'Proxy Authentication Required',
87 | 408 : 'Request Timeout',
88 | 409 : 'Conflict',
89 | 410 : 'Gone',
90 | 411 : 'Length Required',
91 | 412 : 'Precondition Failed',
92 | 413 : 'Request Entity Too Large',
93 | 414 : 'Request-URI Too Long',
94 | 415 : 'Unsupported Media Type',
95 | 416 : 'Requested Range Not Satisfiable',
96 | 417 : 'Expectation Failed',
97 |
98 | 500 : 'Internal Server Error',
99 | 501 : 'Not Implemented',
100 | 502 : 'Bad Gateway',
101 | 503 : 'Service Unavailable',
102 | 504 : 'Gateway Timeout',
103 | 505 : 'HTTP Version Not Supported'
104 | };
105 |
106 | this.view.setHeader(code, {
107 | 'Content-Type': 'text/plain' });
108 | }
109 |
110 | }
111 |
112 | export default Exception;
113 | // END Exceptions Class
114 |
115 | /* End of file Exception.php */
--------------------------------------------------------------------------------
/core/dbdriver/drivers/MysqlDriver.js:
--------------------------------------------------------------------------------
1 | import mysql from 'mysql2/promise'
2 | import Brown from '../../Brown.js'
3 | import bluebird from 'bluebird'
4 |
5 | class MysqlDriver{
6 | constructor(){
7 | this.config = Brown.getInstance().get('db');
8 | }
9 |
10 | async connect(){
11 | try{
12 | //pool
13 | if (this.config.pool == true){
14 | this.connection = await mysql.createPool({
15 | connectionLimit : this.config.connectionLimit?this.config.connectionLimit:10,
16 | host : this.config.host,
17 | user : this.config.user,
18 | password : this.config.password,
19 | database : this.config.db_name,
20 | Promise : bluebird
21 | });
22 | }else{
23 | this.connection = await mysql.createConnection({
24 | host : this.config.host,
25 | user : this.config.user,
26 | password : this.config.password,
27 | database : this.config.db_name,
28 | Promise : bluebird
29 | });
30 | }
31 | }catch(err){
32 | console.log(err);
33 | }
34 | }
35 |
36 | async query(sql,callback){
37 | if (this.connection == null) await this.connect();
38 | var result = await this.connection.query(sql);
39 | return new Promise(function(resolve,reject){
40 | resolve(result);
41 | });
42 | }
43 |
44 | async findById(table,id,fields,id_name){
45 | if (typeof fields === "undefined"){
46 | fields = "*";
47 | }
48 | if (typeof fields === "Array"){
49 | fields = fields.join(',');
50 | }
51 | if (typeof id_name === "undefined"){
52 | id_name = 'id';
53 | }
54 | var sql = "SELECT {fields} FROM {table} WHERE {id_name} = {id}";
55 | sql = sql.replace(/{id_name}/g,id_name).replace(/{id}/g,id).replace(/{table}/g,table).replace(/{fields}/g,fields);
56 | var result = await this.query(sql);
57 | return new Promise(function(resolve,reject){
58 | resolve(result[0]);
59 | });
60 | }
61 |
62 | async findAll(table,fields){
63 | if (typeof fields === "undefined"){
64 | fields = "*";
65 | }
66 | if (typeof fields === "Array"){
67 | fields = fields.join(',');
68 | }
69 | var sql = "SELECT {fields} FROM {table}";
70 | sql = sql.replace(/{table}/g,table).replace(/{fields}/g,fields);
71 | var result = await this.query(sql);
72 | return new Promise(function(resolve,reject){
73 | resolve(result[0]);
74 | });
75 | }
76 |
77 | async deleteById(table,id,id_name){
78 | if (typeof fields === "table"){
79 | throw new Error('Table cannot be null');
80 | }
81 | if (typeof fields === "id"){
82 | throw new Error('id cannot be null');
83 | }
84 | if (typeof id_name === "undefined"){
85 | id_name = 'id';
86 | }
87 | var sql = "DELETE FROM {table} WHERE {id_name} = {id}";
88 | sql = sql.replace(/{id_name}/g,id_name).replace(/{id}/g,id).replace(/{table}/g,table);
89 | var result = await this.query(sql);
90 | return new Promise(function(resolve,reject){
91 | resolve(result[0]);
92 | });
93 | }
94 |
95 | async save(table,record){
96 | var sql = "INSERT INTO {table} (";
97 | sql = sql.replace(/{table}/g,table);
98 | var result = "(";
99 | record.foreach(function(i,v){
100 | sql += i + ',';
101 | result += "'"+v+"',";
102 | });
103 | result = result.substring(0,result.length-1) + ')';
104 | sql = sql.substring(0,sql.length-1) + ') VALUES ' + result + ';';
105 | try{
106 | var result = await this.query(sql);
107 | }catch(err){
108 | console.log(err);
109 | }
110 | return new Promise(function(resolve,reject){
111 | // console.log(result);
112 | resolve(result[0].insertId);
113 | });
114 | }
115 | }
116 |
117 | export default MysqlDriver;
--------------------------------------------------------------------------------
/test/npm-debug.log:
--------------------------------------------------------------------------------
1 | 0 info it worked if it ends with ok
2 | 1 verbose cli [ 'C:\\Program Files\\nodejs\\node.exe',
3 | 1 verbose cli 'C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js',
4 | 1 verbose cli 'run',
5 | 1 verbose cli 'test' ]
6 | 2 info using npm@3.10.3
7 | 3 info using node@v6.5.0
8 | 4 verbose run-script [ 'pretest', 'test', 'posttest' ]
9 | 5 info lifecycle brownjs@0.0.1~pretest: brownjs@0.0.1
10 | 6 silly lifecycle brownjs@0.0.1~pretest: no script for pretest, continuing
11 | 7 info lifecycle brownjs@0.0.1~test: brownjs@0.0.1
12 | 8 verbose lifecycle brownjs@0.0.1~test: unsafe-perm in lifecycle true
13 | 9 verbose lifecycle brownjs@0.0.1~test: PATH: C:\Program Files\nodejs\node_modules\npm\bin\node-gyp-bin;C:\stevenworks\brownjs\node_modules\.bin;C:\Program Files\nodejs;C:\RailsInstaller\Ruby2.2.0\bin;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Microsoft Dynamics AX\50\Client\Bin\;C:\Program Files\Symantec\pcAnywhere\;C:\Program Files\Subversion\bin;C:\Program Files\TortoiseSVN\bin;C:\wamp\bin\php\php5.6.15;C:\Program Files\Heroku\bin;C:\Users\steven\AppData\Local\Android\sdk\platform-tools;C:\ProgramData\chocolatey\bin;C:\Program Files\nodejs\;C:\ProgramData\ComposerSetup\bin;C:\Program Files\Java\jdk1.8.0_91\bin;C:\Program Files\Android\Android Studio\gradle\gradle-2.10\bin;C:\Program Files\Git\cmd;C:\Program Files\TortoiseGit\bin; C:\Users\steven\AppData\Local\Android\sdk\tools;C:\Users\steven\.gradle\wrapper\dists\gradle-2.13-all\7hsc6vr6mi3i6i5m7q9hj4ci1q\gradle-2.13\bin;C:\Program Files\Java\jdk1.8.0_91/bin;C:\Program Files\GtkSharp\2.12\bin;C:\Python27\Scripts;C:\Users\steven\AppData\Local\Enthought\Canopy\User; C:\Users\steven\AppData\Local\Enthought\Canopy\User\Scripts;C:\Python27;C:\Program Files\Bandizip\7z;C:\Users\steven\AppData\Roaming\npm;C:\Users\steven\AppData\Roaming\Composer\vendor\bin;C:\Program Files\Egret\Egret Wing 3\bin
14 | 10 verbose lifecycle brownjs@0.0.1~test: CWD: C:\stevenworks\brownjs
15 | 11 silly lifecycle brownjs@0.0.1~test: Args: [ '/d /s /c', 'mocha --require babel-core/register' ]
16 | 12 silly lifecycle brownjs@0.0.1~test: Returned: code: 1 signal: null
17 | 13 info lifecycle brownjs@0.0.1~test: Failed to exec test script
18 | 14 verbose stack Error: brownjs@0.0.1 test: `mocha --require babel-core/register`
19 | 14 verbose stack Exit status 1
20 | 14 verbose stack at EventEmitter. (C:\Program Files\nodejs\node_modules\npm\lib\utils\lifecycle.js:242:16)
21 | 14 verbose stack at emitTwo (events.js:106:13)
22 | 14 verbose stack at EventEmitter.emit (events.js:191:7)
23 | 14 verbose stack at ChildProcess. (C:\Program Files\nodejs\node_modules\npm\lib\utils\spawn.js:40:14)
24 | 14 verbose stack at emitTwo (events.js:106:13)
25 | 14 verbose stack at ChildProcess.emit (events.js:191:7)
26 | 14 verbose stack at maybeClose (internal/child_process.js:877:16)
27 | 14 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5)
28 | 15 verbose pkgid brownjs@0.0.1
29 | 16 verbose cwd C:\stevenworks\brownjs\test
30 | 17 error Windows_NT 6.1.7601
31 | 18 error argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "run" "test"
32 | 19 error node v6.5.0
33 | 20 error npm v3.10.3
34 | 21 error code ELIFECYCLE
35 | 22 error brownjs@0.0.1 test: `mocha --require babel-core/register`
36 | 22 error Exit status 1
37 | 23 error Failed at the brownjs@0.0.1 test script 'mocha --require babel-core/register'.
38 | 23 error Make sure you have the latest version of node.js and npm installed.
39 | 23 error If you do, this is most likely a problem with the brownjs package,
40 | 23 error not with npm itself.
41 | 23 error Tell the author that this fails on your system:
42 | 23 error mocha --require babel-core/register
43 | 23 error You can get information on how to open an issue for this project with:
44 | 23 error npm bugs brownjs
45 | 23 error Or if that isn't available, you can get their info via:
46 | 23 error npm owner ls brownjs
47 | 23 error There is likely additional logging output above.
48 | 24 verbose exit [ 1, true ]
49 |
--------------------------------------------------------------------------------