Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 4370210

Browse files
committed
first commit
0 parents commit 4370210

File tree

9 files changed

+305
-0
lines changed

9 files changed

+305
-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: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Node.js Express, Sequelize & PostgreSQL: CRUD Rest APIs
2+
3+
For more detail, please visit:
4+
> [Node.js CRUD Rest APIs with Express, Sequelize & PostgreSQL example](https://bezkoder.com/node-express-sequelize-postgresql/)
5+
6+
## Project setup
7+
```
8+
npm install
9+
```
10+
11+
### Run
12+
```
13+
node server.js
14+
```

‎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: "postgres",
4+
PASSWORD: "123",
5+
DB: "testdb",
6+
dialect: "postgres",
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.iLike]: `%${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: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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+
8+
pool: {
9+
max: dbConfig.pool.max,
10+
min: dbConfig.pool.min,
11+
acquire: dbConfig.pool.acquire,
12+
idle: dbConfig.pool.idle
13+
}
14+
});
15+
16+
const db = {};
17+
18+
db.Sequelize = Sequelize;
19+
db.sequelize = sequelize;
20+
21+
db.tutorials = require("./tutorial.model.js")(sequelize, Sequelize);
22+
23+
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: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"name": "nodejs-express-sequelize-postgresql",
3+
"version": "1.0.0",
4+
"description": "Node.js Rest Apis with Express, Sequelize & M",
5+
"main": "server.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1"
8+
},
9+
"keywords": [
10+
"nodejs",
11+
"express",
12+
"sequelize",
13+
"rest",
14+
"api",
15+
"postgresql"
16+
],
17+
"author": "bezkoder",
18+
"license": "ISC",
19+
"dependencies": {
20+
"body-parser": "^1.19.0",
21+
"cors": "^2.8.5",
22+
"express": "^4.17.1",
23+
"pg": "^7.17.1",
24+
"pg-hstore": "^2.3.3",
25+
"sequelize": "^5.21.3"
26+
}
27+
}

‎server.js‎

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

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /