使用Node.js搭建简易RESTfull Api服务

daoen 2020-05-23 PM 3868℃ 2条

本文将介绍如何在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等工具测试接口。

标签: restfull

非特殊说明,本博所有文章均为博主原创。

上一篇 基于SSE实现服务端消息推送
下一篇 没有了

评论啦~



已有 2 条评论


  1. 陈郑譬
    陈郑譬

    陈郑譬:文章真不错http://panc.1ut9wd.cn

    回复 2024-08-31 09:37
  2. daoen
    daoen 博主

    欢迎阅读

    回复 2021-07-30 22:35