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 bce297a

Browse files
committed
first commit
0 parents commit bce297a

File tree

9 files changed

+334
-0
lines changed

9 files changed

+334
-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: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# Node.js CRUD example with SQL Server (MSSQL) - Express Rest APIs and Sequelize
2+
3+
For more detail, please visit:
4+
> [Node.js CRUD example with SQL Server (MSSQL)](https://www.bezkoder.com/node-js-sql-server-crud/)
5+
6+
Front-end that works well with this Back-end
7+
> [Axios Client](https://www.bezkoder.com/axios-request/)
8+
9+
> [Angular 8 Client](https://bezkoder.com/angular-crud-app/) / [Angular 10 Client](https://bezkoder.com/angular-10-crud-app/) / [Angular 11 Client](https://bezkoder.com/angular-11-crud-app/) / [Angular 12 Client](https://bezkoder.com/angular-12-crud-app/)
10+
11+
> [Vue 2 Client](https://bezkoder.com/vue-js-crud-app/) / [Vue 3 Client](https://bezkoder.com/vue-3-crud/) / [Vuetify Client](https://bezkoder.com/vuetify-data-table-example/)
12+
13+
> [React Client](https://bezkoder.com/react-crud-web-api/) / [React Redux Client](https://bezkoder.com/react-redux-crud-example/)
14+
15+
More Practice:
16+
> [Server side Pagination in Node.js with Sequelize](https://www.bezkoder.com/node-js-sequelize-pagination-mysql/)
17+
18+
> [Node.js Express File Upload Rest API example](https://www.bezkoder.com/node-js-express-file-upload/)
19+
20+
> [Node.js Express File Upload with Google Cloud Storage example](https://www.bezkoder.com/google-cloud-storage-nodejs-upload-file/)
21+
22+
Associations:
23+
> [Sequelize Associations: One-to-Many Relationship example](https://www.bezkoder.com/sequelize-associate-one-to-many/)
24+
25+
> [Sequelize Associations: Many-to-Many Relationship example](https://www.bezkoder.com/sequelize-associate-many-to-many/)
26+
27+
Integration (run back-end & front-end on same server/port)
28+
> [Integrate React with Node.js Restful Services](https://www.bezkoder.com/integrate-react-express-same-server-port/)
29+
30+
> [Integrate Angular with Node.js Restful Services](https://www.bezkoder.com/integrate-angular-10-node-js/)
31+
32+
> [Integrate Vue with Node.js Restful Services](https://www.bezkoder.com/serve-vue-app-express/)
33+
34+
## Project setup
35+
```
36+
npm install
37+
```
38+
39+
### Run
40+
```
41+
node server.js
42+
```

‎app/config/db.config.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module.exports = {
2+
HOST: "localhost",
3+
PORT: "1434",
4+
USER: "zkoder",
5+
PASSWORD: "123456",
6+
DB: "bezkoder_db",
7+
dialect: "mssql",
8+
pool: {
9+
max: 5,
10+
min: 0,
11+
acquire: 30000,
12+
idle: 10000
13+
}
14+
};

‎app/controllers/tutorial.controller.js

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: 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+
port: dbConfig.PORT,
7+
dialect: dbConfig.dialect,
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+
// Delete all Tutorials
25+
router.delete("/", tutorials.deleteAll);
26+
27+
app.use('/api/tutorials', router);
28+
};

‎package.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"name": "node-js-crud-sql-server",
3+
"version": "1.0.0",
4+
"description": "Node.js CRUD example with SQL Server",
5+
"main": "server.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1"
8+
},
9+
"keywords": [
10+
"node js",
11+
"sql server",
12+
"mssql",
13+
"crud",
14+
"express",
15+
"sequelize",
16+
"rest api"
17+
],
18+
"author": "bezkoder",
19+
"license": "ISC",
20+
"dependencies": {
21+
"cors": "^2.8.5",
22+
"express": "^4.17.1",
23+
"sequelize": "^6.6.5",
24+
"tedious": "^11.4.0"
25+
}
26+
}

‎server.js

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

0 commit comments

Comments
(0)

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