Skip to content

Commit 8df3c91

Browse files
committed
first commit
0 parents  commit 8df3c91

File tree

9 files changed

+300
-0
lines changed

9 files changed

+300
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
node_modules
2+
package-lock.json

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Node.js Rest APIs with Express, Sequelize & MySQL example
2+
3+
For more detail, please visit:
4+
> [Build Node.js Rest APIs with Express, Sequelize & MySQL](https://bezkoder.com/node-js-express-sequelize-mysql/)
5+
6+
> [Deploying/Hosting Node.js app on Heroku with MySQL database](https://bezkoder.com/deploy-node-js-app-heroku-cleardb-mysql/)
7+
8+
## Project setup
9+
```
10+
npm install
11+
```
12+
13+
### Run
14+
```
15+
node server.js
16+
```

app/config/db.config.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module.exports = {
2+
HOST: "localhost",
3+
USER: "root",
4+
PASSWORD: "123456",
5+
DB: "testdb",
6+
dialect: "mysql",
7+
pool: {
8+
max: 5,
9+
min: 0,
10+
acquire: 30000,
11+
idle: 10000
12+
}
13+
};
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
const db = require("../models");
2+
const Tutorial = db.tutorials;
3+
const Op = db.Sequelize.Op;
4+
5+
// Create and Save a new Tutorial
6+
exports.create = (req, res) => {
7+
// Validate request
8+
if (!req.body.title) {
9+
res.status(400).send({
10+
message: "Content can not be empty!"
11+
});
12+
return;
13+
}
14+
15+
// Create a Tutorial
16+
const tutorial = {
17+
title: req.body.title,
18+
description: req.body.description,
19+
published: req.body.published ? req.body.published : false
20+
};
21+
22+
// Save Tutorial in the database
23+
Tutorial.create(tutorial)
24+
.then(data => {
25+
res.send(data);
26+
})
27+
.catch(err => {
28+
res.status(500).send({
29+
message:
30+
err.message || "Some error occurred while creating the Tutorial."
31+
});
32+
});
33+
};
34+
35+
// Retrieve all Tutorials from the database.
36+
exports.findAll = (req, res) => {
37+
const title = req.query.title;
38+
var condition = title ? { title: { [Op.like]: `%${title}%` } } : null;
39+
40+
Tutorial.findAll({ where: condition })
41+
.then(data => {
42+
res.send(data);
43+
})
44+
.catch(err => {
45+
res.status(500).send({
46+
message:
47+
err.message || "Some error occurred while retrieving tutorials."
48+
});
49+
});
50+
};
51+
52+
// Find a single Tutorial with an id
53+
exports.findOne = (req, res) => {
54+
const id = req.params.id;
55+
56+
Tutorial.findByPk(id)
57+
.then(data => {
58+
res.send(data);
59+
})
60+
.catch(err => {
61+
res.status(500).send({
62+
message: "Error retrieving Tutorial with id=" + id
63+
});
64+
});
65+
};
66+
67+
// Update a Tutorial by the id in the request
68+
exports.update = (req, res) => {
69+
const id = req.params.id;
70+
71+
Tutorial.update(req.body, {
72+
where: { id: id }
73+
})
74+
.then(num => {
75+
if (num == 1) {
76+
res.send({
77+
message: "Tutorial was updated successfully."
78+
});
79+
} else {
80+
res.send({
81+
message: `Cannot update Tutorial with id=${id}. Maybe Tutorial was not found or req.body is empty!`
82+
});
83+
}
84+
})
85+
.catch(err => {
86+
res.status(500).send({
87+
message: "Error updating Tutorial with id=" + id
88+
});
89+
});
90+
};
91+
92+
// Delete a Tutorial with the specified id in the request
93+
exports.delete = (req, res) => {
94+
const id = req.params.id;
95+
96+
Tutorial.destroy({
97+
where: { id: id }
98+
})
99+
.then(num => {
100+
if (num == 1) {
101+
res.send({
102+
message: "Tutorial was deleted successfully!"
103+
});
104+
} else {
105+
res.send({
106+
message: `Cannot delete Tutorial with id=${id}. Maybe Tutorial was not found!`
107+
});
108+
}
109+
})
110+
.catch(err => {
111+
res.status(500).send({
112+
message: "Could not delete Tutorial with id=" + id
113+
});
114+
});
115+
};
116+
117+
// Delete all Tutorials from the database.
118+
exports.deleteAll = (req, res) => {
119+
Tutorial.destroy({
120+
where: {},
121+
truncate: false
122+
})
123+
.then(nums => {
124+
res.send({ message: `${nums} Tutorials were deleted successfully!` });
125+
})
126+
.catch(err => {
127+
res.status(500).send({
128+
message:
129+
err.message || "Some error occurred while removing all tutorials."
130+
});
131+
});
132+
};
133+
134+
// find all published Tutorial
135+
exports.findAllPublished = (req, res) => {
136+
Tutorial.findAll({ where: { published: true } })
137+
.then(data => {
138+
res.send(data);
139+
})
140+
.catch(err => {
141+
res.status(500).send({
142+
message:
143+
err.message || "Some error occurred while retrieving tutorials."
144+
});
145+
});
146+
};

app/models/index.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const dbConfig = require("../config/db.config.js");
2+
3+
const Sequelize = require("sequelize");
4+
const sequelize = new Sequelize(dbConfig.DB, dbConfig.USER, dbConfig.PASSWORD, {
5+
host: dbConfig.HOST,
6+
dialect: dbConfig.dialect,
7+
operatorsAliases: false,
8+
9+
pool: {
10+
max: dbConfig.pool.max,
11+
min: dbConfig.pool.min,
12+
acquire: dbConfig.pool.acquire,
13+
idle: dbConfig.pool.idle
14+
}
15+
});
16+
17+
const db = {};
18+
19+
db.Sequelize = Sequelize;
20+
db.sequelize = sequelize;
21+
22+
db.tutorials = require("./tutorial.model.js")(sequelize, Sequelize);
23+
24+
module.exports = db;

app/models/tutorial.model.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module.exports = (sequelize, Sequelize) => {
2+
const Tutorial = sequelize.define("tutorial", {
3+
title: {
4+
type: Sequelize.STRING
5+
},
6+
description: {
7+
type: Sequelize.STRING
8+
},
9+
published: {
10+
type: Sequelize.BOOLEAN
11+
}
12+
});
13+
14+
return Tutorial;
15+
};

app/routes/turorial.routes.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
module.exports = app => {
2+
const tutorials = require("../controllers/tutorial.controller.js");
3+
4+
var router = require("express").Router();
5+
6+
// Create a new Tutorial
7+
router.post("/", tutorials.create);
8+
9+
// Retrieve all Tutorials
10+
router.get("/", tutorials.findAll);
11+
12+
// Retrieve all published Tutorials
13+
router.get("/published", tutorials.findAllPublished);
14+
15+
// Retrieve a single Tutorial with id
16+
router.get("/:id", tutorials.findOne);
17+
18+
// Update a Tutorial with id
19+
router.put("/:id", tutorials.update);
20+
21+
// Delete a Tutorial with id
22+
router.delete("/:id", tutorials.delete);
23+
24+
// Create a new Tutorial
25+
router.delete("/", tutorials.deleteAll);
26+
27+
app.use('/api/tutorials', router);
28+
};

package.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"name": "nodejs-express-sequelize-mysql",
3+
"version": "1.0.0",
4+
"description": "Node.js Rest Apis with Express, Sequelize & MySQL",
5+
"main": "server.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1"
8+
},
9+
"keywords": [
10+
"nodejs",
11+
"express",
12+
"rest",
13+
"api",
14+
"sequelize",
15+
"mysql"
16+
],
17+
"author": "bezkoder",
18+
"license": "ISC",
19+
"dependencies": {
20+
"body-parser": "^1.19.0",
21+
"express": "^4.17.1",
22+
"mysql2": "^2.0.2",
23+
"sequelize": "^5.21.2"
24+
}
25+
}

server.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
const express = require("express");
2+
const bodyParser = require("body-parser");
3+
4+
const app = express();
5+
6+
// parse requests of content-type - application/json
7+
app.use(bodyParser.json());
8+
9+
// parse requests of content-type - application/x-www-form-urlencoded
10+
app.use(bodyParser.urlencoded({ extended: true }));
11+
12+
const db = require("./app/models");
13+
14+
db.sequelize.sync();
15+
// // drop the table if it already exists
16+
// db.sequelize.sync({ force: true }).then(() => {
17+
// console.log("Drop and re-sync db.");
18+
// });
19+
20+
// simple route
21+
app.get("/", (req, res) => {
22+
res.json({ message: "Welcome to bezkoder application." });
23+
});
24+
25+
require("./app/routes/turorial.routes")(app);
26+
27+
// set port, listen for requests
28+
const PORT = process.env.PORT || 8080;
29+
app.listen(PORT, () => {
30+
console.log(`Server is running on port ${PORT}.`);
31+
});

0 commit comments

Comments
 (0)