Init Express, Pug, Sass, Sequelize, Socket.io
This commit is contained in:
parent
2dce6bb719
commit
4f3447b2e4
14 changed files with 3312 additions and 0 deletions
46
app.js
Normal file
46
app.js
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
let createError = require("http-errors");
|
||||||
|
let express = require("express");
|
||||||
|
let path = require("path");
|
||||||
|
let cookieParser = require("cookie-parser");
|
||||||
|
let logger = require("morgan");
|
||||||
|
let sassMiddleware = require("node-sass-middleware");
|
||||||
|
|
||||||
|
let indexRouter = require("./routes/index");
|
||||||
|
|
||||||
|
let app = express();
|
||||||
|
|
||||||
|
// view engine setup
|
||||||
|
app.set("views", path.join(__dirname, "views"));
|
||||||
|
app.set("view engine", "pug");
|
||||||
|
|
||||||
|
app.use(logger("dev"));
|
||||||
|
app.use(express.json());
|
||||||
|
app.use(express.urlencoded({ extended: false }));
|
||||||
|
app.use(cookieParser());
|
||||||
|
app.use(sassMiddleware({
|
||||||
|
src: path.join(__dirname, "public"),
|
||||||
|
dest: path.join(__dirname, "public"),
|
||||||
|
indentedSyntax: true, // true = .sass and false = .scss
|
||||||
|
sourceMap: true
|
||||||
|
}));
|
||||||
|
app.use(express.static(path.join(__dirname, "public")));
|
||||||
|
|
||||||
|
app.use("/", indexRouter);
|
||||||
|
|
||||||
|
// catch 404 and forward to error handler
|
||||||
|
app.use((req, res, next) => {
|
||||||
|
next(createError(404));
|
||||||
|
});
|
||||||
|
|
||||||
|
// error handler
|
||||||
|
app.use((err, req, res) => {
|
||||||
|
// set locals, only providing error in development
|
||||||
|
res.locals.message = err.message;
|
||||||
|
res.locals.error = req.app.get("env") === "development" ? err : {};
|
||||||
|
|
||||||
|
// render the error page
|
||||||
|
res.status(err.status || 500);
|
||||||
|
res.render("error");
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = app;
|
102
bin/www
Executable file
102
bin/www
Executable file
|
@ -0,0 +1,102 @@
|
||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const app = require("../app");
|
||||||
|
const debug = require("debug")("letu:server");
|
||||||
|
const http = require("http");
|
||||||
|
const models = require("../models");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get port from environment and store in Express.
|
||||||
|
*/
|
||||||
|
|
||||||
|
let port = normalizePort(process.env.PORT || "3000");
|
||||||
|
app.set("port", port);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create HTTP server.
|
||||||
|
*/
|
||||||
|
|
||||||
|
let server = http.createServer(app);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create socket.io server
|
||||||
|
*/
|
||||||
|
|
||||||
|
const io = require("socket.io")(server);
|
||||||
|
io.on("connection", require("../sockets"));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listen on provided port, on all network interfaces.
|
||||||
|
*/
|
||||||
|
|
||||||
|
models.sequelize.sync().then(() => {
|
||||||
|
server.listen(port, () => {
|
||||||
|
debug("Express server listening on port " + server.address().port);
|
||||||
|
});
|
||||||
|
server.on("error", onError);
|
||||||
|
server.on("listening", onListening);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalize a port into a number, string, or false.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function normalizePort(val) {
|
||||||
|
let port = parseInt(val, 10);
|
||||||
|
|
||||||
|
if (isNaN(port)) {
|
||||||
|
// named pipe
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (port >= 0) {
|
||||||
|
// port number
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event listener for HTTP server "error" event.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function onError(error) {
|
||||||
|
if (error.syscall !== "listen") {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
let bind = typeof port === "string"
|
||||||
|
? "Pipe " + port
|
||||||
|
: "Port " + port;
|
||||||
|
|
||||||
|
// handle specific listen errors with friendly messages
|
||||||
|
switch (error.code) {
|
||||||
|
case "EACCES":
|
||||||
|
console.error(bind + " requires elevated privileges");
|
||||||
|
process.exit(1);
|
||||||
|
break;
|
||||||
|
case "EADDRINUSE":
|
||||||
|
console.error(bind + " is already in use");
|
||||||
|
process.exit(1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event listener for HTTP server "listening" event.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function onListening() {
|
||||||
|
let addr = server.address();
|
||||||
|
let bind = typeof addr === "string"
|
||||||
|
? "pipe " + addr
|
||||||
|
: "port " + addr.port;
|
||||||
|
debug("Listening on " + bind);
|
||||||
|
}
|
10
config/config_exemple.json
Normal file
10
config/config_exemple.json
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"database": {
|
||||||
|
"username": "root",
|
||||||
|
"password": null,
|
||||||
|
"database": "database_test",
|
||||||
|
"host": "127.0.0.1",
|
||||||
|
"dialect": "postgres",
|
||||||
|
"operatorsAliases": false
|
||||||
|
}
|
||||||
|
}
|
36
models/index.js
Normal file
36
models/index.js
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
const Sequelize = require("sequelize");
|
||||||
|
const basename = path.basename(__filename);
|
||||||
|
const config = require(__dirname + "/../config/config.json")["database"];
|
||||||
|
const db = {};
|
||||||
|
|
||||||
|
let sequelize;
|
||||||
|
if (config.use_env_variable) {
|
||||||
|
sequelize = new Sequelize(process.env[config.use_env_variable], config);
|
||||||
|
} else {
|
||||||
|
sequelize = new Sequelize(config.database, config.username, config.password, config);
|
||||||
|
}
|
||||||
|
|
||||||
|
fs
|
||||||
|
.readdirSync(__dirname)
|
||||||
|
.filter(file => {
|
||||||
|
return (file.indexOf(".") !== 0) && (file !== basename) && (file.slice(-3) === ".js");
|
||||||
|
})
|
||||||
|
.forEach(file => {
|
||||||
|
const model = sequelize["import"](path.join(__dirname, file));
|
||||||
|
db[model.name] = model;
|
||||||
|
});
|
||||||
|
|
||||||
|
Object.keys(db).forEach(modelName => {
|
||||||
|
if (db[modelName].associate) {
|
||||||
|
db[modelName].associate(db);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
db.sequelize = sequelize;
|
||||||
|
db.Sequelize = Sequelize;
|
||||||
|
|
||||||
|
module.exports = db;
|
3043
package-lock.json
generated
Normal file
3043
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
21
package.json
Normal file
21
package.json
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"name": "letu",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"start": "node ./bin/www"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"cookie-parser": "~1.4.4",
|
||||||
|
"debug": "~2.6.9",
|
||||||
|
"express": "~4.16.1",
|
||||||
|
"http-errors": "~1.6.3",
|
||||||
|
"morgan": "~1.9.1",
|
||||||
|
"node-sass-middleware": "0.11.0",
|
||||||
|
"pg": "^8.2.1",
|
||||||
|
"pug": "2.0.0-beta11",
|
||||||
|
"sequelize": "^5.21.12",
|
||||||
|
"sequelize-cli": "^5.5.1",
|
||||||
|
"socket.io": "^2.3.0"
|
||||||
|
}
|
||||||
|
}
|
8
public/stylesheets/style.css
Normal file
8
public/stylesheets/style.css
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
body {
|
||||||
|
padding: 50px;
|
||||||
|
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; }
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #00B7FF; }
|
||||||
|
|
||||||
|
/*# sourceMappingURL=style.css.map */
|
9
public/stylesheets/style.css.map
Normal file
9
public/stylesheets/style.css.map
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"file": "style.css",
|
||||||
|
"sources": [
|
||||||
|
"style.sass"
|
||||||
|
],
|
||||||
|
"names": [],
|
||||||
|
"mappings": "AAAA,AAAA,IAAI,CAAC;EACH,OAAO,EAAE,IAAI;EACb,IAAI,EAAE,kDAAkD,GAAG;;AAE7D,AAAA,CAAC,CAAC;EACA,KAAK,EAAE,OAAO,GAAG"
|
||||||
|
}
|
6
public/stylesheets/style.sass
Normal file
6
public/stylesheets/style.sass
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
body
|
||||||
|
padding: 50px
|
||||||
|
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif
|
||||||
|
|
||||||
|
a
|
||||||
|
color: #00B7FF
|
9
routes/index.js
Normal file
9
routes/index.js
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
let express = require("express");
|
||||||
|
let router = express.Router();
|
||||||
|
|
||||||
|
/* GET home page. */
|
||||||
|
router.get("/", (req, res) => {
|
||||||
|
res.render("index", { title: "L'ETU" });
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = router;
|
4
sockets/index.js
Normal file
4
sockets/index.js
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
module.exports = socket => {
|
||||||
|
console.log("New connection !");
|
||||||
|
socket.emit("connected");
|
||||||
|
}
|
6
views/error.pug
Normal file
6
views/error.pug
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
extends layout
|
||||||
|
|
||||||
|
block content
|
||||||
|
h1= message
|
||||||
|
h2= error.status
|
||||||
|
pre #{error.stack}
|
5
views/index.pug
Normal file
5
views/index.pug
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
extends layout
|
||||||
|
|
||||||
|
block content
|
||||||
|
h1= title
|
||||||
|
p Welcome to #{title}
|
7
views/layout.pug
Normal file
7
views/layout.pug
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
doctype html
|
||||||
|
html
|
||||||
|
head
|
||||||
|
title= title
|
||||||
|
link(rel="stylesheet", href="/stylesheets/style.css")
|
||||||
|
body
|
||||||
|
block content
|
Reference in a new issue