Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/madhusudhand/donode
Super fast & Lightweight node framework to build RESTful APIs.
https://github.com/madhusudhand/donode
es6 framework javascript mvc node-framework node-js nodejs
Last synced: 25 days ago
JSON representation
Super fast & Lightweight node framework to build RESTful APIs.
- Host: GitHub
- URL: https://github.com/madhusudhand/donode
- Owner: madhusudhand
- License: mit
- Created: 2016-12-13T09:03:01.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2017-11-24T08:01:30.000Z (almost 7 years ago)
- Last Synced: 2024-10-14T04:48:13.569Z (about 1 month ago)
- Topics: es6, framework, javascript, mvc, node-framework, node-js, nodejs
- Language: JavaScript
- Homepage:
- Size: 109 KB
- Stars: 6
- Watchers: 2
- Forks: 2
- Open Issues: 17
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# donode
Superfast & Lightweight node framework for building RESTful APIs.
**Simple** . **Flexible** . **High Performance** . **ES2015+**
Enables developers to focus on writing reusable application logic in a
highly modular approach.**Use [donode-cli](https://www.npmjs.com/package/donode-cli), to get started.**
**NOTE: Requires node 8.0 or higher **
## High Performance
Here are the [performance results](https://github.com/madhusudhand/node-performance).
## Documentation
### App Structure
Create the app using [donode-cli](https://www.npmjs.com/package/donode-cli),
it is as **simple** and **modular** as- app
- controllers
- middleware
- headers.js
- routes.js
- env
- development.env.js
- production.env.js
- app.js### Routing
**One Place** for all your routes and they go into **app/routes.js**.
A Route can be as *simple* as
```
{
path: '/hello',
method: 'GET',
handler: 'HelloController@get'
}
```
| Property | Type | Description |
| :--- | :--- | :--- |
| path | string | url for the route |
| method | string | can be one of GET, POST, PUT, UPDATE, DELETE. |
| handler | string | **format**: *SomeController@method*
Here in this format **SomeController** is the controller (a class) located in **app/controllers** directory.
And **method** (name after @) is the name of the method in the given controller, which gets called and send response.
more details available in **controllers** section. |#### Advanced Routing
A Route can take options like *middleware, headers, children*.
```
{
path: '/user/{id}',
method: 'GET',
handler: 'UserController@get',
middleware: ['Auth'],
headers: ['allow-cors'],
children: [{
path: '/settings',
method: 'GET',
handler: 'UserController@settings',
}]
}
```
| Property | Type | Description |
| :--- | :--- | :--- |
| path | string | A route can have params in its path.
*syntax*: **{param}**
*example*:
*/user/{id}* can respond to */user/1, /user/123* etc..|
| method | string | values are not limited GET, POST, PUT, UPDATE, DELETE.
can be any type of request that server can listen to. (HEAD, OPTIONS etc..) |
| handler | string | A controller can be from a sub directory inside controllers directory.
*syntax*: **subdirectory/SomeController@method**
here in this *SomeController* is located in *app/controllers/subdirectory*. |
| middleware | array
or
object | A Middleware is an intermediate handler which can be used to perform some pre-checks such as Auth.
It is a class located in **app/middleware** directory and will be called before the **handler** method.
***Array** Syntax*: **['Middleware1', 'Middleware2']**
A list of strings which are the names of the *classes* from *app/middleware* directory. When attached to a route, these will be called in the given order before the actual **handler**.
more details available in **middleware** section.
***Object** syntax*:
**{
all: ['Middleware1'],
only: ['Middleware2'],
children: ['Middleware3']
}**
-- **all**: attached to current the route and all its children.
-- **only**: attached only to current route.
-- **children**: attached to all the children, but not to current route.
**Note**: All are optional. Any of them can be given/ignored.
**Order**: middleware defined under **all, children** which are coming from parent routes (if any), then **all, only** of current route. |
| headers | array | **headers** property allows to attach a set of headers that can to be sent along with the *response* for every request.
It takes an array of stings which are defined in **app/headers.js**.
**syntax**
['allow-cors', 'json-content']
**Note**: currently headers attached to a route will apply only to it. Not to children. Object syntax is yet to come !!!|
| children | array | Routes can be nested with this attribute.
This takes list of sub-routes which takes same set of above properties.
**example route config**
{
path: '/user/{id}',
method: 'GET',
handler: 'UserController@get',
children: [{
path: '/settings',
method: 'POST',
handler: 'UserController@settings'
}]
}
this will register the routes
**GET**: */user/{id}*
**POST**: */user/{id}/settings* |### Controllers
**app/controllers**: A place for all controllers of the app.
A controller is a class which inherits **Controller** from donode, and has the handler methods of a route.
```js
const Controller = require('donode').Controller;class HomeController extends Controller {
constructor() {
super();
}get(request, response) {
response.send({
'app': 'works !!!'
});
}
}module.exports = HomeController;
```The method **get(request, response)** will be the handler for a route.
```
handler: 'HomeController@get'
```It gets *request, response* as params.
#### Request
It is a native *Node Request* object. Along with default properties it also contains
| Property | Route | Values |
| :--- | :--- | :--- |
| query | /user?p1=123&p2=donode | { p1: 123, p2: 'donode' } |
| params | /user/{id} | { id: 123 } |
| body | - | payload sent along with request |
| headers | - | headers sent along with request |
| url | - | { } |
| originalUrl | /user/{id} | /user/123 |
| method | - | GET, POST, PUT, DELETE etc.. |#### Response
It is a native *Node Response* object. Along with default properties it also contains
| Method | definition | Description |
| :--- | :--- | :--- |
| send | send([response_code,] responseObject) | It takes optional response code and a response object which whill be sent.
default: 200 (OK) |
| reject | reject([response_code], responseObject) | takes optional response_code and rejection responseObject.
default: 401 (bad request) |
| setHeader | setHeader(type, value) | takes header type and value |### Middleware
```
const Middleware = require('donode').Middleware;class Auth extends Middleware {
constructor() {
super();
}handle(request, response, next) {
// do some auth validation here// if (not authorized)
// return response.send(401, { some: 'error data' });// else (proceed to the controller hander)
return next();
}
}module.exports = Auth;
```**Note**:
When response.send() or response.reject() are called in a middleware, the call chain stops and handler method will not be called.
### Environments
Environments for the app can be managed by creating corresponding configuration file
> env/.env.js
This configuration can be used with **NODE_ENV** while running the app.
> $ NODE_ENV= node app.js
**Examples:**
```
NODE_ENV=production node app.js
NODE_ENV=stage node app.js
```Without NODE_ENV it defaults to `development.env.js`.