init boilerplate
This commit is contained in:
parent
c481dc8f4b
commit
492b4ceee5
12
.env-cmdrc.json
Normal file
12
.env-cmdrc.json
Normal 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
65
app.js
Normal 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
12
config/database.js
Normal 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
16
config/db-tests.js
Normal 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
12
config/mail.js
Normal 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
14
config/robots.js
Normal 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);
|
||||||
|
}
|
||||||
|
});
|
22
config/sitemap-generator.js
Normal file
22
config/sitemap-generator.js
Normal 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
2035
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
49
package.json
Normal file
49
package.json
Normal 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
3
public/css/main.css
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
body{
|
||||||
|
background-color: blue;
|
||||||
|
}
|
0
public/favicon.png
Normal file
0
public/favicon.png
Normal file
46
readme.md
Normal file
46
readme.md
Normal 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
22
routes/api.js
Normal 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
24
routes/index.js
Normal 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
24
routes/middlewear.js
Normal 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
5
views/index/index.pug
Normal 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
25
views/layout.pug
Normal 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')
|
Loading…
Reference in New Issue
Block a user