本文将介绍如何在Node环境下使用 Express、Sequelize 和 MySQL 构建一个 RESTfull Api服务。
1.安装Node
最简单的方式,直接从官网(nodejs.org)下载.pkg文件,找到对应操作系统版本,图形化安装即可。
图形化安装会自动配置环境变量,装完后运行node -v 验证安装是否成功
2.安装MySQL环境
这里直接使用phpstudy集成安装包,打开界面,运行MySQL即可
3.创建项目
$ mkdir node_rest_api
$ cd node_rest_api
npm init
name: (nodejs-express-sequelize-mysql)
version: (1.0.0)
description: Node.js Rest Apis with Express, Sequelize & MySQL.
entry point: (index.js) server.js
test command:
git repository:
keywords: nodejs, express, sequelize, mysql, rest, api, docker
author: Christos Ploutarchou
license: (ISC)
Is this ok? (yes) yes项目初始化之后,运行
npm install express body-parser cors sequelize mysql2 --save安装完成后,package.json 文件应如下:
{
"name": "node_rest_api",
"version": "1.0.0",
"description": "node.js rest apis with express, sequelize & mysql",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"nodejs",
"express",
"sequelize",
"mysql",
"rest",
"api"
],
"author": "yangdaoen",
"license": "ISC",
"dependencies": {
"body-parser": "^1.19.0",
"cors": "^2.8.5",
"express": "^4.17.1",
"mysql2": "^2.1.0",
"sequelize": "^5.21.7"
}
}4.新建 Express Web 服务器
新建server.jsru'xia
const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const server = express();
const db = require("./models");
const corsSettings = {
originL: "http://localhost:8081"
};
const api = require("./routes/index");
server.use(cors(corsSettings));
// Parse request of content-type - application/json
server.use(bodyParser.json());
// parse requests of content-type -application/x-www-form-urlencoded
server.use(bodyParser.urlencoded({ extended: true }));
server.use("/", api);
// set listening ports for request
const port = process.env.PORT || 8080;
server.listen(port, () => {
console.log(`Server running on port : ${port}`);
});
// 如果你要删除已有的表并重新同步数据库,请运行以下函数
// db.dropRestApiTable();
db.databaseConf.sync();运行以下命令
node server.js在浏览器中打开 URL http://localhost:8080/
5.配置 MySQL 数据库和 Sequelize
创建config文件夹,添加db.config.js 文件
module.exports = {
HOST: "localhost",
USER: "root",
PASSWORD: "pass",
DB: "restapi",
dialect: "mysql",
pool: {
max: 10,//最大连接数
min: 0,
acquire: 30000,//错误重连接时间
idle: 50000
}
};创建app/models/index.js:
const dbConfig = require("../config/db.config");
const Sequelize = require("sequelize");
const database = 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.databaseConf = database;
db.posts = require("./Sequelize.model")(database, Sequelize);
db.indexModal = require("./IndexModal")(database, Sequelize);
db.dropRestApiTable = () => {
db.databaseConf.sync({ force: true }).then(() => {
console.log("restTutorial table just dropped and db re-synced.");
});
};
module.exports = db;定义 Sequelize 模型
创建Sequelize.model.js文件
module.exports = (database, Sequelize) => {
return database.define("restTutorial", {
title: {
type: Sequelize.STRING
},
description: {
type: Sequelize.TEXT
},
published: {
type: Sequelize.BOOLEAN
},
publisher: {
type: Sequelize.STRING
}
});
};创建控制器
app/controllers文件夹中,使用以下 CRUD 函数创建 Post.js
create
findAll
findOne
update
delete
deleteAll
findAllPublished
findByPublisherName以create为例
const db = require('../models')
const postObj = db.posts
const Op = db.Sequelize.Op
// 创建并保存新帖子
exports.create = (request, result) => {
if (!request.body.title) {
result.status(400).send({
message: "Content cannot be empty"
});
}
// 创建一个帖子对象
const post = {
title: request.body.title,
description: request.body.description,
published: request.body.published ? request.body.published : false,
publisher: request.body.publisher ? request.body.publisher : false
};
// 将帖子对象保存到数据库
postObj.create(post).then(data => {
result.send(data);
}).catch(err => {
result.status(500).send({
message: err.message || "Some error occurred while saving."
});
});
};6.定义路由
在route/ 文件夹中创建一个index.js文件
const post = require("../controllers/Post");
const indexModal = require("../controllers/IndexModal");
const express = require("express");
const router = express.Router();
// 创建新文章
router.post("/api/posts/create", post.create);
// // 检索所有文章
router.get("/api/posts/all", post.getAllPosts);
// 检索所有已发布文章
router.get("/api/posts/published", post.getAllPublishedPosts);
// 按发布者名称检索所有已发布文章
router.get("/api/posts/publisher", post.getAllPostsByPublisherName);
// 按标题检索所有文章
router.get("/api/posts", post.getPostByTitle);
// 按 id 检索文章
router.get("/api/posts/:id", post.getPostByID);
// // 按 id 更新文章
router.put("/api/post/update/:id", post.updatePostByID);
// // 按 id 删除文章
router.delete("/api/post/delete/:id", post.deletePostByID);
// 删除所有文章
router.delete("/api/posts/deleteAll", post.deleteAllPosts);
router.get("/api/indexmodal/all", indexModal.getAllModals);
router.post("/api/indexmodal/create", indexModal.createModal);
module.exports = router;在 server.js 中添加:
const api = require("./routes/index");
server.use("/", api);7.测试
运行server.js测试 API
node server.js
Server running on port : 80
Executing (default): CREATE TABLE IF NOT EXISTS restTutorials (id INTEGER NOT NULL auto_increment , title VARCHAR(255), description TEXT, published TINYINT(1), publisher VARCHAR(255), createdAt DATETIME NOT NULL, updatedAt DATETIME NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM restTutorials最后 可以使用Postman等工具测试接口。
陈郑譬:文章真不错http://panc.1ut9wd.cn
欢迎阅读