Node.js 实现RestFul API
2020-09-17 本文已影响0人
lncircle
前端开发人员,有时候需要做一些接口调试,koa2+mysql2的组合方式恰好能够快速实现,作为学习笔记记录下
环境准备
首先需要node.js和mysql,mac可使用homebrew快速安装
搭建koa2项目
可以命令一步一步搭建
npm init
这里我们使用koa-generator生成项目,类似vue-cli
### 全局安装 koa-generator
npm install koa-generator -g
### 创建项目,demo为项目名
koa2 demo
### 进入项目目录
cd demo
### 安装项目依赖
npm install
### 启动项目 可任选一种
npm start (每次代码修改都需要重启项目)
npm run dev (代码发生改变时自动重启项目)
生成的项目目录结构如下,可以看到package.json中已给我们添加了很多插件依赖
启动项目完成后,在浏览器输入:localhost:3000,浏览器运行结果,搭建的koa2项目就已完成
实现API
安装依赖
这里选择Node的ORM框架Sequelize来操作数据库。这样,我们读写的都是JavaScript对象,Sequelize帮我们把对象变成数据库中的行,同时安装mysql2。
npm install sequelize mysql2 --save
数据库连接
在根目录下新建config目录->新建db.js文件
const Sequelize = require('sequelize');
/**
* 数据库名称, 账号,密码
*/
const sequelize = new Sequelize('zf','root','123456',{
host:'localhost',
dialect:'mysql',
operatorsAliases:false,
dialectOptions:{
//字符集
charset:'utf8mb4',
collate:'utf8mb4_unicode_ci',
supportBigNumbers: true,
bigNumberStrings: true
},
pool:{
max: 5,
min: 0,
acquire: 30000,
idle: 10000
},
timezone: '+08:00' //东八时区
});
module.exports = {
sequelize
};
定义数据模型
在根目录下新建models目录->新建pet.js文件
const moment = require('moment');
module.exports = function(sequelize,DataTypes){
return sequelize.define('pet',
{
id:{
type: DataTypes.INTEGER(11),
primaryKey: true,
allowNull: false,
autoIncrement: true
},
name:{
type: DataTypes.STRING(100),
allowNull: false,
field: 'name'
},
gender:{
type: DataTypes.TINYINT(0),
allowNull: false,
field: 'gender'
},
birth:{
type: DataTypes.DATE,
allowNull: false,
field: 'birth',
set: function(val) {
this.setDataValue('birth', new Date(val*1000));
},
get() {
return moment(this.getDataValue('birth')).format('YYYY-MM-DD HH:mm:ss');
}
},
isDeleted: {
type: DataTypes.BOOLEAN,
allowNull: true,
defaultValue: false
},
createdAt: {
type: DataTypes.DATE,
allowNull: true,
get() {
return moment(this.getDataValue('createdAt')).format('YYYY-MM-DD HH:mm:ss');
}
},
updatedAt: {
type: DataTypes.DATE,
allowNull: true,
get() {
return moment(this.getDataValue('updatedAt')).format('YYYY-MM-DD HH:mm:ss');
}
},
version: {
type: DataTypes.BIGINT,
allowNull: true,
}
},
{
/**
* 如果为true,则表示名称和model相同,即user
* 如果为fasle,mysql创建的表名称会是复数,即users
* 如果指定的表名称本身就是复数,则形式不变
*/
freezeTableName: true,
//关闭Sequelize的自动添加timestamp的功能
timestamps: false
}
);
}
模型操作
在根目录下新建modules目录->新建pet.js文件
//引入db配置
const db = require('../config/db')
//引入sequelize对象
const Sequelize = db.sequelize
//引入数据表模型
const pet = Sequelize.import('../models/pet')
//自动创建表
pet.sync({ force: false });
//数据库操作类
class petModel {
static async createPet(data) {
var now = Date.now();
return await pet.create({
name: data.name,
gender: data.gender,
birth: data.birth,
createdAt: now,
updatedAt: now,
version: 0
})
}
static async getPets() {
return await pet.findAll({
where: {
}
})
}
static async getPet(id) {
console.log(id)
return await pet.findOne({
where: {
id
}
})
}
}
module.exports = petModel;
逻辑操作
在根目录下新建controllers目录->新建pet.js文件
const petModel = require("../modules/pet");
class petController {
/**
* 创建宠物信息
* @param ctx
* @returns {Promise.<void>}
*/
static async create(ctx){
//接收客服端
let req = ctx.request.body;
if(req.name && req.gender && req.birth ){
try{
//创建宠物信息模型
const ret = await petModel.createPet(req);
const data = await petModel.getPet(ret.id);
ctx.response.status = 200;
ctx.body = {
code: 200,
msg: '创建宠物信息成功',
data
}
}catch(err){
console.log(err)
ctx.response.status = 412;
ctx.body = {
code: 412,
msg: '创建宠物信息失败',
data: err
}
}
}else {
ctx.response.status = 416;
ctx.body = {
code: 200,
msg: '参数不齐全'
}
}
}
/**
* 获取宠物详情
* @param ctx
* @returns {Promise.<void>}
*/
static async detail(ctx){
let id = ctx.request.query.id;
if(id){
try{
let data = await petModel.getPet(id);
ctx.response.status = 200;
ctx.body = {
code: 200,
msg: '查询成功',
data
}
}catch(err){
ctx.response.status = 412;
ctx.body = {
code: 412,
msg: '查询失败',
data
}
}
}else {
ctx.response.status = 416;
ctx.body = {
code: 416,
msg: '宠物ID必须传'
}
}
}
}
module.exports = petController;
路由设置
在routes目录下新建pet.js文件
const router = require('koa-router')()
const PetController = require('../controllers/pet');
router.prefix('/pet')
router.post('/create',PetController.create);
router.get('/get',PetController.detail)
module.exports = router
然后再App.js中添加以下内容
const pet = require('./routes/pet')
app.use(pet.routes(), pet.allowedMethods())
最后的项目目录结构如下:
启动项目服务
npm run dev
这时候会发现报如下错误:
到这里,看gitHub上的提示是新版本不支持这种引入方式,请参考最新的demo
这里把sequelize的版本降低下来引入
npm install sequelize@^5.x.x --save
再 npm run dev,可以看到能正常运行起来了
测试API
用postman调用刚刚新建的接口
查看数据库
简单的接口实现已完成