Node.js - Express - MongoDB Generator
A Node.js project generator using Express and connected to MongoBD.
Installation
npm install -g nem-generator
Features
- Authentication middleware (with JWT)
- Authorization middleware (role-based access control)
- Connection to MongoDB (using Mongoose)
- Example for User model (schema, service, controller, router)
- Config file prepared for 3 environments (dev, test, prod)
Documentation
How to use
Simply run
nem-gen
and you will be prompted with questions, allowing you to configure your project (for now, the project name is the only configurable parameter during project creation).
Project Structure
This project follows a Model - Service - Controller - Router
structure. This is well explained in this StackOverflow answer followed to design this solution.
The generated project has the following files:
.
βββ app.js
βββ bin
β βββ www
βββ config
β βββ config.js
β βββ config.json
β βββ mongod.conf
β βββ roles.js
βββ controllers
β βββ userController.js
βββ models
β βββ user.js
βββ package.json
βββ routes
β βββ authorizeRole.js
β βββ usersRoute.js
β βββ verifyToken.js
βββ services
βββ userService.js
Config File
In config/config.json you can configure global variables to use in your project.
Parameter | Description | Default values | Required |
---|---|---|---|
config_id | Environment name | ["development","testing","production"] for the corresponding environment |
false |
app_name | Project name | name inserted in project creation | false |
node_port | Port where the project will run | 5000 (if no value exist in the config) or [3000, 3000, 3001] for the corresponding environment |
false |
database | URL to a MongoDB database | "mongodb://127.0.0.1/{project-name}-{environment}" | true |
secret | Secret for the JWT. Make sure you change this to secure your tokens | "supersecret" | true |
tokenLife | Duration of the token expressed in seconds or a string describing a time span zeit/ms |
2678400 (31 days) | true |
Make sure you always have the required fields at least in "development", since the default project structure uses these. You can only repeat config variables in other environments if you want to override the default config variable values found in the default "development" environment.
Generated default file:
{
"development": {
"config_id": "development",
"app_name": "project-name",
"node_port": 3000,
"database": "mongodb://127.0.0.1/project-name-dev",
"secret": "supersecret",
"tokenLife": 2678400
},
"testing": {
"config_id": "testing",
"node_port": 3000,
"database": "mongodb://127.0.0.1/project-name-test"
},
"production": {
"config_id": "production",
"node_port": 3001,
"database": "mongodb://127.0.0.1/project-name-prod"
}
}
You can add your own config parameters in this file, and use them in your code with global.gConfig.{parameter-name}
, e.g. global.gConfig.database
.
Authentication and Authorization
Make sure verifyToken
middleware is always called before authorize
, in order to extract the role of the received token.
Here is an example:
router.get('/', verifyToken, authorize(roles.ADMIN), async function (req, res){
...
}
This function is only authorized for tokens from users with 'Admin' role.
You can also authorize multiple roles by passing an array to the authorize
, p.e.
authorize([roles.USER, roles.ADMIN])
Remove restrictions
If you don't want any role restriction, just remove the authorize
middleware.
You can also remove the token restriction, remove the verifyToken
middleware.
TODO
- Allow selection of database type (add support to SQL using Sequelize)
- Allow roles configuration during project creation
- Add optional client app template (for React, Angular or Vue)
Feel free to create issues with more ideas!
License
This project is licensed under the MIT License - see the LICENSE file for details