init boilerplate

This commit is contained in:
WieErWill 2020-03-29 22:41:16 +02:00
parent c481dc8f4b
commit 492b4ceee5
17 changed files with 2386 additions and 0 deletions

12
.env-cmdrc.json Normal file
View File

@ -0,0 +1,12 @@
{
"development": {
"env": "development",
"IP": "localhost",
"PORT": "8080"
// add all environment variables for your development server
},
"production": {
"env": "production",
// add all environment variables for your production server
}
}

65
app.js Normal file
View File

@ -0,0 +1,65 @@
/*## Dependencies ##*/
const express = require('express'),
app = express(),
bodyParser = require('body-parser'),
cookieParser = require('cookie-parser'),
path = require('path'),
session = require('express-session'),
flash = require('connect-flash'),
favicon = require('serve-favicon'),
methodOverride= require('method-override'),
morgan = require('morgan');
//link your route files here
const indexRoute = require('./routes/index'),
apiRoute = require('./routes/api');
//Now your app configuration
if (app.get('env') === 'development'){
app.use(morgan('dev')); // log every request to the console for development
}
app.use(express.static(path.join(__dirname, 'public')));
app.use(favicon(path.join(__dirname,'public','favicon.png')));
app.use(cookieParser('ChooseAStringForYourCookies'));
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
var sess = {
secret: "ChooseASessionString",
resave: true,
saveUninitialized: true,
cookie: { maxAge: 1000 * 60 * 60 * 24 * 7 } //how long should cookies been saved
};
if (app.get('env') === 'production') {
app.set('trust proxy', 1) // trust first proxy
sess.cookie.secure = true // serve secure cookies
}
app.use(session(sess));
app.set('views', __dirname + '/views');
app.set("view engine", "pug");
app.set('view options', {
layout: false
});
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use(flash());
app.use(methodOverride("_method")); //use ?_YourMethod for your method changes
app.use(function(req, res, next){
res.locals.success = req.flash('success');
res.locals.error = req.flash('error');
res.locals.currentUser = req.user;
next();
});
//Routes
app.use("/", indexRoute);
app.use("/api", apiRoute);
app.get('*', (req,res)=>{ res.redirect("/"); });
/*## PORT ##*/
app.listen(process.env.PORT, process.env.IP, function(){
console.log("Server is listening at " + process.env.IP + ":" + process.env.PORT + " with Environment: " + process.env.env);
});

12
config/database.js Normal file
View File

@ -0,0 +1,12 @@
// config/database.js
module.exports = {
'connection': {
'host': 'XXXXX', // your database host address
'port': '3306', // your database port; default MySQL port is 3306
'user' : 'XXXXX', // username
'password': 'XXXXX' //password
},
'database': 'XXXXX', // database name
'users_table': 'XXXXXX' //table name for users
//... add more tables for quick changes in your Backend
};

16
config/db-tests.js Normal file
View File

@ -0,0 +1,16 @@
var mysql = require('mysql'),
dbconfig= require('./database'),
con = mysql.createConnection(dbconfig.connection);
// test mysql connection
app.listen(process.env.PORT, process.env.IP, function () {
console.log("Server started");
var sql = 'SELECT * FROM ' + dbconfig.database + "." + dbconfig.users_table;
con.query(sql, function (err, rows) {
if (err) {
console.log(err);
} else {
console.log("Database reached successfully");
}
});
});

12
config/mail.js Normal file
View File

@ -0,0 +1,12 @@
/*## Mail Config ##*/
module.exports = {
'connection' : {
'host': 'smtp.XXXXX.de', // mailserver address
'port': '587', //587 else 465
'secure': false, // true for 465, false for other ports
'auth': {
'user': 'XXXX@XXXXX.com', // username
'pass': 'XXXXXXXXXX' // password
}
}
};

14
config/robots.js Normal file
View File

@ -0,0 +1,14 @@
const robotize = require('robotize');
const opts = {
useragent: 'googlebot',
allow: ['index.html', 'about.html'],
disallow: ['404.html']
};
robotize(opts, (err, robots) => {
if (err) {
throw new Error(err);
} else {
console.log(robots);
}
});

View File

@ -0,0 +1,22 @@
const SitemapGenerator = require('advanced-sitemap-generator');
// create generator
const generator = SitemapGenerator('https://XXXXXXX', { // add your site url here
ignoreHreflang: true,
maxDepth: 0,
filepath: path.join(process.cwd(), 'sitemap.xml'),
maxEntriesPerFile: 50000,
stripQuerystring: true,
excludeFileTypes: ['ico', 'bmp', 'ogg', 'webp', 'mp4', 'webm', 'mp3', 'ttf', 'woff', 'json', 'rss', 'atom', 'gz', 'zip', 'rar', '7z', 'css', 'js', 'gzip', 'exe', 'svg', 'xml'],
excludeURLs: ['login', 'dashboard'],
changeFreq: weekly,
filepath: sitemap.xml // path to be saved
});
// register event listeners
generator.on('done', () => {
// sitemaps created
});
// start the crawler
generator.start();

2035
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

49
package.json Normal file
View File

@ -0,0 +1,49 @@
{
"name": "nodejs-boilerplate",
"version": "1.0.0",
"description": "NodeJS boilerplate for express apps",
"main": "app.js",
"dependencies": {
"body-parser": "^1.19.0",
"connect-flash": "^0.1.1",
"cookie-parser": "^1.4.5",
"env-cmd": "^10.1.0",
"express": "^4.17.1",
"express-session": "^1.17.0",
"method-override": "^3.0.0",
"morgan": "^1.10.0",
"multer": "^1.4.2",
"mysql": "^2.18.1",
"nodemailer": "^6.4.6",
"nodemon": "^2.0.2",
"pug": "^2.0.4",
"serve-favicon": "^2.5.0"
},
"devDependencies": {},
"scripts": {
"initPackage": "sh ./config/init.sh",
"createDB": "sh ./config/initDB.sh",
"startServer": "env-cmd -e development nodemon app.js",
"startDevDB": "sudo /etc/init.d/mysql start",
"stopDevDB": "sudo /etc/init.d/mysql stop",
"dev": "npm run startDevDB && npm run startDevServer",
"start": "node app.js",
"test": "echo \"Error: no test specified\" && exit 1",
"testDB": "node ./config/db-test.js"
},
"repository": {
"type": "git",
"url": "git:https://github.com/wieerwill/nodejs-boilerplate.git"
},
"keywords": [
"node",
"express",
"boilerplate"
],
"author": "Robert Jeutter",
"license": "SEE LICENSE IN LICENSE",
"bugs": {
"url": "https://github.com/wieerwill/nodejs-boilerplate/issues"
},
"homepage": "https://github.com/wieerwill/nodejs-boilerplate#readme"
}

3
public/css/main.css Normal file
View File

@ -0,0 +1,3 @@
body{
background-color: blue;
}

0
public/favicon.png Normal file
View File

46
readme.md Normal file
View File

@ -0,0 +1,46 @@
# NodeJS Boilerplate for Express Apps
## Routing
| URL | Method | Desc |
| --- | --- | --- |
| / | GET | Index Site |
| /api | GET | Your API starts here |
## Requirements
-
#### npm Packages
- express
- ejs
- [nodemailer](https://www.npmjs.com/package/advanced-sitemap-generator)
- mysql
- body-parser
-
## Folder Overview
- config: all your apps configuration files for databases, connections and other
- database.js: your database connections and table overview
- db-test.js: test your database connection with this js
- mail.js: your mail connection
- robots.js: get a robot.txt file with this script
- sitemap-generator.js: get a sitemap with this script
- public: all files your Guests can access directly
- css: your css files
- main.css: a starter .css file
- img: all your images
- js: all your JS scripts
- routes: whereever you are routing, keep it simple and structured
- api.js: here every /api requests goes
- index.js: here every / reqest goes
- middlewear.js: use middlewear for repeating actions across multiple routes like authorisation/authentication
- views: here lies what your guests can later see in pug.js
- index: all files for index routes
- index.pug: the index routes view
- layout.pug: make it easy with a standarized layout for all your files
- .env-cmdrc.json: all environment variables for your servers
- app.js: entry file to start everything up
- gitignore: ignore some files in your git repository that don't matter
- package.json: overview and scripts for your packages
- package-lock.json
- readme.md: log everything to never forget anything

22
routes/api.js Normal file
View File

@ -0,0 +1,22 @@
var express = require('express'),
router = express.Router(),
bodyParser = require('body-parser'),
methodOverride = require("method-override"),
mysql = require('mysql');
var dbconfig = require('../config/database');
var con = mysql.createConnection(dbconfig.connection);
router.get('/getSomething', (req, res)=> {
var sql='SELECT * FROM ' + dbconfig.database + "." + dbconfig.users_table;
con.query(sql, function(err,rows){
if(err){
res.sendStatus(400).json(null);
}else{
res.sendStatus(200).json(rows);
}
});
});
module.exports = router;

24
routes/index.js Normal file
View File

@ -0,0 +1,24 @@
const express = require('express'),
router = express(),
mysql = require('mysql'),
bodyParser= require('body-parser'),
nodemailer = require('nodemailer'),
session = require('express-session'),
flash = require('connect-flash'),
cookieParser = require('cookie-parser'),
dbconfig = require('../config/database'),
mailconfig = require('../config/mail'),
middlewear = require('./middlewear'),
con = mysql.createConnection(dbconfig.connection);
// Index
router.route("/")
.get((req, res)=> { // you got a GET request
res.render('index/index'); // get your index view file
})
.post((req, res) => {
//do something with a POST request
});
module.exports = router;

24
routes/middlewear.js Normal file
View File

@ -0,0 +1,24 @@
const express = require('express'),
router = express(),
bodyParser= require('body-parser'),
session = require('express-session'),
flash = require('connect-flash');
module.exports = {
// check if a user is logged in
isLoggedIn: function (req, res, next){
if (req.isAuthenticated()){
return next();
}
res.redirect('/login');
},
//check if a user is authorised for admin action
isAdmin: function (req, res, next){
if(req.user.role == admin){
return next();
}
req.flash('error', 'not authorised');
res.redirect("/login");
}
}

5
views/index/index.pug Normal file
View File

@ -0,0 +1,5 @@
extends ../layout
block body
div
p Aspernatur laboriosam dolor praesentium soluta. Veniam soluta rerum fugit non vel est et fuga. Molestias a rerum nisi. Commodi explicabo est soluta quia doloribus deserunt nesciunt et. Consequatur necessitatibus deleniti eius ipsa voluptates tenetur. Molestiae ratione animi aut harum ex. Assumenda ad aperiam consequatur. Non exercitationem vel molestiae ut quas alias et suscipit. Aut nihil dolorum quo ipsa perspiciatis labore modi. Recusandae facere rerum aut totam. Quis ut dolorem sit corporis voluptate amet. Earum quo mollitia voluptas vitae est quo harum. Temporibus dolorem nam eum. Iure tempore rerum omnis. Eius quasi qui nostrum. Sequi dolorem labore ipsam et ut et quo. Explicabo aut praesentium voluptatem enim. Voluptatem sed cupiditate ea. Autem architecto maxime molestiae distinctio. Perferendis omnis aut dolorem.

25
views/layout.pug Normal file
View File

@ -0,0 +1,25 @@
doctype
html(lang='de')
head
meta(charset='utf8')
meta(name='viewport', content='width=device-width, initial-scale=1.0')
meta(title='NodeJS Boilerplate')
meta(description='Use me for your Projects')
base(href='/')
title NodeJS Boilerplate
link(rel='stylesheet', href='/css/main.css')
body(data-spy="scroll" class="pushable" style="height:90vh")
header
h1 NodeJS Boilerplate
p You can use this Boilerplate for yourself
main
block body
footer
small Get me on
a(href="") Github
script(src='js/index.js')