mysql:
sql
select * from tutorials;
# CREATE TABLE IF NOT EXISTS `tutorials` (`id` INTEGER NOT NULL auto_increment , `title` VARCHAR(255), `description` VARCHAR(255), `published` TINYINT(1), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
insert into tutorials values(1,'geovindu','geovidu',1,'2025-05-04','2025-05-04');
insert into tutorials values(2,'涂聚文','涂聚文',0,'2025-05-04','2025-05-04');
前提配置好环境
执行程序会自动生成表
vscode 下写的代码:
javascript
/**
* dbConfig.js
* node 20 vue.js 3.0
* ide: vscode
* mysql 8.0
* npm install express sequelize mysql2 cors
*/
const dbConfig = {
HOST: "localhost",
USER: "root",
PASSWORD: "geovindu",
DB: "geovindu",
dialect: "mysql",
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
}
};
export default dbConfig;
/**
* select * from tutorials;
# CREATE TABLE IF NOT EXISTS `tutorials` (`id` INTEGER NOT NULL auto_increment , `title` VARCHAR(255), `description` VARCHAR(255), `published` TINYINT(1), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
insert into tutorials values(1,'geovindu','geovidu',1,'2025-05-04','2025-05-04');
insert into tutorials values(2,'涂聚文','涂聚文',2,'2025-05-04','2025-05-04');
*
*/
/**
* models/tutorial.model.js
* node 20 vue.js 3.0
* ide: vscode
* mysql 8.0
* npm install express sequelize mysql2 cors
*/
//module.exports
const Tutorial = (sequelize, Sequelize) => {
const Tutorial = sequelize.define("tutorial", {
title: {
type: Sequelize.STRING
},
description: {
type: Sequelize.STRING
},
published: {
type: Sequelize.BOOLEAN
}
});
return Tutorial;
};
export default Tutorial;
/**
* models/index.js
* node 20 vue.js 3.0
* ide: vscode
* mysql 8.0
* npm install express sequelize mysql2 cors
*/
import dbConfig from "../db.config.js";
import Sequelize from "sequelize";
import tutorials from "./tutorial.model.js"
const sequelize = new Sequelize(dbConfig.DB, dbConfig.USER, dbConfig.PASSWORD, {
host: dbConfig.HOST,
dialect: dbConfig.dialect,
operatorsAliases: false,
pool: {
max: dbConfig.pool.max,
min: dbConfig.pool.min,
acquire: dbConfig.pool.acquire,
idle: dbConfig.pool.idle
}
});
const db = {};
db.Sequelize = Sequelize;
db.sequelize = sequelize;
//db.tutorials = require("./tutorial.model.js")(sequelize, Sequelize);
db.tutorials=tutorials(sequelize, Sequelize);
//module.exports = db;
export default db;
/**
* controllers/tutorial.controller.js
* node 20 vue.js 3.0
* ide: vscode
* mysql 8.0
* npm install express sequelize mysql2 cors
*/
import db from "../models/index.js";
const Tutorial = db.tutorials;
const Op = db.Sequelize.Op;
//module.exports.
const create = (req, res) => {
// Validate request
if (!req.body.title) {
res.status(400).send({
message: "Content can not be empty!"
});
return;
}
// Create a Tutorial
const tutorial = {
title: req.body.title,
description: req.body.description,
published: req.body.published ? req.body.published : false
};
// Save Tutorial in the database
Tutorial.create(tutorial)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Tutorial."
});
});
};
//exports.create;
// exports.create = create;
//module.exports.
const findAll = (req, res) => {
const title = req.query.title;
var condition = title ? { title: { [Op.like]: `%${title}%` } } : null;
Tutorial.findAll({ where: condition })
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving tutorials."
});
});
};
//exports.findAll = findAll;
//findByPk
//module.exports.
const findOne = (req, res) => {
const id = req.params.id;
Tutorial.findByPk(id)
.then(data => {
if (data) {
res.send(data);
} else {
res.status(404).send({
message: `Cannot find Tutorial with id=${id}.`
});
}
})
.catch(err => {
res.status(500).send({
message: "Error retrieving Tutorial with id=" + id
});
});
};
//exports.findOne = findOne;
// module.exports.
const update = (req, res) => {
const id = req.params.id;
Tutorial.update(req.body, {
where: { id: id }
})
.then(num => {
if (num == 1) {
res.send({
message: "Tutorial was updated successfully."
});
} else {
res.send({
message: `Cannot update Tutorial with id=${id}. Maybe Tutorial was not found or req.body is empty!`
});
}
})
.catch(err => {
res.status(500).send({
message: "Error updating Tutorial with id=" + id
});
});
};
// exports.update = update;
//destroy module.exports.
const deleteid = (req, res) => {
const id = req.params.id;
Tutorial.destroy({
where: { id: id }
})
.then(num => {
if (num == 1) {
res.send({
message: "Tutorial was deleted successfully!"
});
} else {
res.send({
message: `Cannot delete Tutorial with id=${id}. Maybe Tutorial was not found!`
});
}
})
.catch(err => {
res.status(500).send({
message: "Could not delete Tutorial with id=" + id
});
});
};
//exports.Delete = Delete;
//destroy module.exports
const deleteAll = (req, res) => {
Tutorial.destroy({
where: {},
truncate: false
})
.then(nums => {
res.send({ message: `${nums} Tutorials were deleted successfully!` });
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while removing all tutorials."
});
});
};
//exports.deleteAll = deleteAll;
//module.exports.
const findAllPublished = (req, res) => {
Tutorial.findAll({ where: { published: true } })
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving tutorials."
});
});
};
//exports.findAllPublished = findAllPublished;
// 这个命名问题 tutorials
// 使用 ES6 的默认导出语法,直接导出包含所有函数的对象
export default
{
findAllPublished,
deleteAll,
deleteid,
update,
findOne,
findAll,
create
};
//function
//module.exports={findAllPublished,deleteAll,Delete,update,findOne,findAll,create};
/**
* routes/tutorial.routes.js
* node 20 vue.js 3.0
* ide: vscode
* mysql 8.0
* npm install express sequelize mysql2 cors
* https://www.bezkoder.com/node-js-express-sequelize-mysql/
* 路由报错,还没有配置好 数据库连接OK
*/
import express from "express"
import tutorials from "../controllers/tutorial.controller.js"
//import Tutorial from "../models/tutorial.model.js";
//module.exports
const routes= app => {
//const tutorials = require("../controllers/tutorial.controller.js");
var router = express.Router();
// Create a new Tutorial
//app.post("/", Tutorial.findAll);
router.post("/",tutorials.create)
// Retrieve all Tutorials
router.get("/", tutorials.findAll);
/**/
// Retrieve all published Tutorials
router.get("/published", tutorials.findAll);
// Retrieve a single Tutorial with id
router.get("/:id", tutorials.findOne);
// Update a Tutorial with id
router.put("/:id", tutorials.update);
// Delete a Tutorial with id
router.put("/:id", tutorials.deleteid);
// Delete all Tutorials
router.put("/", tutorials.deleteAll);
//app.use('/api/tutorials', router);
app.use('/api/tutorials',router);
};
export default routes;
/**
* server.js
* node 20 vue.js 3.0
* ide: vscode
* mysql 8.0
* npm install express sequelize mysql2 cors
*/
import express from "express";
import cors from "cors";
import db from "./models/index.js"
import routes from "./routes/turorial.routes.js"
const Tutorial = db.tutorials;
//require("./app/routes/turorial.routes")(app);
const app = express();
//var routes =require("./app/routes/turorial.routes");
routes(app);
//app.routes();
var corsOptions = {
origin: "http://localhost:8080"
};
app.use(cors(corsOptions));
// parse requests of content-type - application/json
app.use(express.json());
// parse requests of content-type - application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: true }));
//http://localhost:8080/models
///http://localhost:8080/tutorials
//const db = require("./app/models");
db.sequelize.sync()
.then(() => {
console.log("Synced db.");
})
.catch((err) => {
console.log("Failed to sync db: " + err.message);
});
//routes(app); //这行路由编译报错
// simple route
app.get("/", (req, res) => {
/*
if (!req.body.title) {
res.status(400).send({
message: "Content can not be empty!"
});
return;
}
*/
// Create a Tutorial
const tutorial = {
title: '兴大兴',
description: '涂没有什么',
published: false,
createdAt:'2024-08-05',
updatedAt:'2024-08-05'
};
// Save Tutorial in the database
Tutorial.create(tutorial)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Tutorial."
});
});
res.json({ message: "数据添加成功!." });
});
// set port, listen for requests http://localhost:8080
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}.`);
});
运行:
javascript
node server
WebStorm 2023.1 下的代码 来源于: https://www.bezkoder.com/node-js-express-sequelize-mysql/
javascript
/**
* dbConfig.js
* node 20 vue.js 3.0
* ide: WebStorm 2023.1
* mysql 8.0
* npm install express sequelize mysql2 cors
* */
module.exports = {
HOST: "localhost",
USER: "root",
PASSWORD: "geovindu",
DB: "geovindu",
dialect: "mysql",
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
}
};
/*
* http://localhost:8081/api/tutorials
http://localhost:8081/api/tutorials/1
http://localhost:8081/api/tutorials?title=geovindu
http://localhost:8081/api/tutorials/published
* npm install express sequelize mysql2 cors --save
* select * from tutorials;
# CREATE TABLE IF NOT EXISTS `tutorials` (`id` INTEGER NOT NULL auto_increment , `title` VARCHAR(255), `description` VARCHAR(255), `published` TINYINT(1), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
insert into tutorials values(1,'geovindu','geovidu',1,'2025-05-04','2025-05-04');
insert into tutorials values(2,'涂聚文','涂聚文',0,'2025-05-04','2025-05-04');
* */
/**
* models/index.js
* node 20 vue.js 3.0
* ide: WebStorm 2023.1
* mysql 8.0
* npm install express sequelize mysql2 cors
* */
const dbConfig = require("../config/db.config.js");
const Sequelize = require("sequelize");
const sequelize = new Sequelize(dbConfig.DB, dbConfig.USER, dbConfig.PASSWORD, {
host: dbConfig.HOST,
dialect: dbConfig.dialect,
operatorsAliases: false,
pool: {
max: dbConfig.pool.max,
min: dbConfig.pool.min,
acquire: dbConfig.pool.acquire,
idle: dbConfig.pool.idle
}
});
const db = {};
db.Sequelize = Sequelize;
db.sequelize = sequelize;
db.tutorials = require("./tutorial.model.js")(sequelize, Sequelize);
module.exports = db;
/**
* models/tutorial.model.js
* node 20 vue.js 3.0
* ide: WebStorm 2023.1
* mysql 8.0
* npm install express sequelize mysql2 cors
* */
module.exports = (sequelize, Sequelize) => {
const Tutorial = sequelize.define("tutorial", {
title: {
type: Sequelize.STRING
},
description: {
type: Sequelize.STRING
},
published: {
type: Sequelize.BOOLEAN
}
});
return Tutorial;
};
/**
* controllers/tutorial.controller.js
* node 20 vue.js 3.0
* ide: WebStorm 2023.1
* mysql 8.0
* npm install express sequelize mysql2 cors
* */
const db = require("../models");
const Tutorial = db.tutorials;
const Op = db.Sequelize.Op;
// Create and Save a new Tutorial
exports.create = (req, res) => {
// Validate request
if (!req.body.title) {
res.status(400).send({
message: "Content can not be empty!"
});
return;
}
// Create a Tutorial
const tutorial = {
title: req.body.title,
description: req.body.description,
published: req.body.published ? req.body.published : false
};
// Save Tutorial in the database
Tutorial.create(tutorial)
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the Tutorial."
});
});
};
// Retrieve all Tutorials from the database.
exports.findAll = (req, res) => {
const title = req.query.title;
var condition = title ? { title: { [Op.like]: `%${title}%` } } : null;
Tutorial.findAll({ where: condition })
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving tutorials."
});
});
};
// Find a single Tutorial with an id
exports.findOne = (req, res) => {
const id = req.params.id;
Tutorial.findByPk(id)
.then(data => {
if (data) {
res.send(data);
} else {
res.status(404).send({
message: `Cannot find Tutorial with id=${id}.`
});
}
})
.catch(err => {
res.status(500).send({
message: "Error retrieving Tutorial with id=" + id
});
});
};
// Update a Tutorial by the id in the request
exports.update = (req, res) => {
const id = req.params.id;
Tutorial.update(req.body, {
where: { id: id }
})
.then(num => {
if (num == 1) {
res.send({
message: "Tutorial was updated successfully."
});
} else {
res.send({
message: `Cannot update Tutorial with id=${id}. Maybe Tutorial was not found or req.body is empty!`
});
}
})
.catch(err => {
res.status(500).send({
message: "Error updating Tutorial with id=" + id
});
});
};
// Delete a Tutorial with the specified id in the request
exports.delete = (req, res) => {
const id = req.params.id;
Tutorial.destroy({
where: { id: id }
})
.then(num => {
if (num == 1) {
res.send({
message: "Tutorial was deleted successfully!"
});
} else {
res.send({
message: `Cannot delete Tutorial with id=${id}. Maybe Tutorial was not found!`
});
}
})
.catch(err => {
res.status(500).send({
message: "Could not delete Tutorial with id=" + id
});
});
};
// Delete all Tutorials from the database.
exports.deleteAll = (req, res) => {
Tutorial.destroy({
where: {},
truncate: false
})
.then(nums => {
res.send({ message: `${nums} Tutorials were deleted successfully!` });
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while removing all tutorials."
});
});
};
// find all published Tutorial
exports.findAllPublished = (req, res) => {
Tutorial.findAll({ where: { published: true } })
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving tutorials."
});
});
};
/**
* routes/tutorial.routes.js
* node 20 vue.js 3.0
* ide: WebStorm 2023.1
* mysql 8.0
* npm install express sequelize mysql2 cors
* */
module.exports = app => {
const tutorials = require("../controllers/tutorial.controller.js");
var router = require("express").Router();
// Create a new Tutorial
router.post("/", tutorials.create);
// Retrieve all Tutorials
router.get("/", tutorials.findAll);
// Retrieve all published Tutorials
router.get("/published", tutorials.findAllPublished);
// Retrieve a single Tutorial with id
router.get("/:id", tutorials.findOne);
// Update a Tutorial with id
router.put("/:id", tutorials.update);
// Delete a Tutorial with id
router.delete("/:id", tutorials.delete);
// Delete all Tutorials
router.delete("/", tutorials.deleteAll);
app.use('/api/tutorials', router);
};
/**
* server.js
* node 20 vue.js 3.0
* ide: WebStorm 2023.1
* mysql 8.0
* npm install express sequelize mysql2 cors
* */
const express = require("express");
const cors = require("cors");
const app = express();
var corsOptions = {
origin: "http://localhost:8081"
};
app.use(cors(corsOptions));
// parse requests of content-type - application/json
app.use(express.json());
// parse requests of content-type - application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: true }));
const db = require("./app/models");
db.sequelize.sync()
.then(() => {
console.log("Synced db.");
})
.catch((err) => {
console.log("Failed to sync db: " + err.message);
});
// // drop the table if it already exists
// db.sequelize.sync({ force: true }).then(() => {
// console.log("Drop and re-sync db.");
// });
// simple route
app.get("/", (req, res) => {
res.json({ message: "Welcome to bezkoder application." });
});
require("./app/routes/turorial.routes")(app);
// set port, listen for requests
const PORT = process.env.PORT || 8081;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}.`);
});
运行:
javascript
node server.js