# node API **Repository Path**: chuandonghuang/node-api ## Basic Information - **Project Name**: node API - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-09-15 - **Last Updated**: 2021-09-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # **一、项目初始化** ## 1.npm初始化 ``` 1.npm init -y ``` 生成package.json文件:记录项目依赖 ​ ## 2.git初始化 ``` 1.git init ``` ## 3.创建ReadMe文件 # 二、搭建项目 ## 1、安装Koa框架 ``` npm i koa ``` ## 2、编写最基本的app ```js const Koa = require('koa') const app = new Koa() // 中间件 app.use((ctx,next)=>{ ctx.body = "Hello API" }) app.listen(3000,()=>{ console.log('server is running on http://localhost:3000'); }) ``` ## 3、测试 ![image-20210915114919279](C:\Users\EDZ\AppData\Roaming\Typora\typora-user-images\image-20210915114919279.png) # 三、项目优化 ## 1、自动重启服务 安装nodemon工具 ``` npm i nodemon -D ``` 编写`package.json`脚本 ```json "start":"nodemon ./src/main.js" ``` ## 2、读取配置文件 安装dotenv,读取根目录中的.env文件,将配置写入process.env中 ```js npm i dotenv ``` 创建`.env`文件 ```js APP_PORT = 3000 ``` 创建`config.defult.js`文件 ```js const dotenv = require('dotenv') dotenv.config() module.exports = process.env ``` 改写`main.js`文件 ```js const Koa = require('koa') const {APP_PORT} = require('./config/config.defult') const app = new Koa() // 中间件 app.use((ctx,next)=>{ ctx.body = "Hello API" }) app.listen(3000,()=>{ console.log(`server is running on http://localhost:${APP_PORT}`); }) ``` # 四、添加路由 路由:根据不同的url,调用对应处理函数 ## 1、安装koa-router ``` npm i koa-router ``` 步骤: 1.导入包 2.实例化对象 3.编写主键 4.注册中间件 ## 2、编写路由 创建src/router目录,编写userRouter文件 ```js const Router = require('koa-router') // prefix为路由前缀 const router = new Router({prefix:'/user'}) router.get('/list',(ctx,next)=>{ ctx.body = 'this is userlist' }) module.exports = router ``` ## 3、改写main.js ```js const Koa = require('koa') const {APP_PORT} = require('./config/config.defult') const app = new Koa() const userRouter = require('./router/userRoute') console.log(userRouter); app.use(userRouter.routes()) // 中间件 app.use((ctx,next)=>{ ctx.body = "Hello API" }) app.listen(3000,()=>{ console.log(`server is running on http://localhost:${APP_PORT}`); }) ``` # 五、目录结构优化 ## 1.将http服务和app业务拆分 创建`app/index.js` ```js const Koa = require('koa') const userRouter = require('../router/userRoute') const app = new Koa() // 中间件 app.use(userRouter.routes()) module.exports = app ``` 改写`main.js` ```js const {APP_PORT} = require('./config/config.defult') const app = require('./app/index') app.listen(3000,()=>{ console.log(`server is running on http://localhost:${APP_PORT}`); }) ``` ## 2.将路由和控制器拆分 路由:解析URL,分发给控制器对应的方法 ​ 改写`userRouter.js` ```js const Router = require('koa-router') const {register,login} = require('../controller/user.controller') // prefix为路由前缀 const router = new Router({prefix:'/user'}) //注册接口 router.post('/register',register) router.post('/login',login) module.exports = router ``` 控制器:处理不同的业务 ​ 创建`user.controller.js` ```js class UserController{ async register(ctx,next){ ctx.body = 'this is register' } async login(ctx,next){ ctx.body = 'this is login' } } module.exports=new UserController() ``` # 六、解析body ## 1.安装koa-body ``` npm i koa-body ``` ## 2.注册中间件 改写`app/index.js` ![image-20210915154603083](C:\Users\EDZ\AppData\Roaming\Typora\typora-user-images\image-20210915154603083.png) 3.解析请求数据 改写`user.controller.js` ```js const {createUser} = require('../service/user.service') class UserController{ async register(ctx,next){ // 获取数据 const {user_name,password} = ctx.request.body // 操作数据库 const res = await createUser(user_name,password) // 返回结果 console.log(res); ctx.body = ctx.request.body } async login(ctx,next){ ctx.body = 'this is login' } } module.exports=new UserController() ``` 4.拆分service层 service层主要是做数据库处理 创建`src/sercice/user.service.js` ```js class UserService { async createUser(user_name,password){ // todo:写入数据库 return '写入数据库成功' } } module.exports = new UserService() ``` # 七、数据库操作 sequelize ORM数据库工具 ORM:对象关系映射 - 数据表映射一个对象 - 数据表中的数据行(记录)对应一个对象 - 数据表字段对应对象的属性 - 数据表的操作对应对象方法 ## 1.安装sequelize ``` npm i mysql2 sequelize ``` ## 2.连接数据库 创建`src/db/seq.js` ```js const { Sequelize } = require('sequelize'); const { MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PWD, MYSQL_DB } = require('../config/config.defult') const seq = new Sequelize(MYSQL_DB,MYSQL_USER,MYSQL_PWD,{ host:MYSQL_HOST, dialect:'mysql' }) seq.authenticate().then(()=>{ console.log('successfully.'); }).catch (error=> { console.error('数据库连接失败', error); }) module.exports = seq ``` ## 3.创建数据表 新建`src/model/user_model.js` ```js const {DataTypes} = require('sequelize') const seq = require('../db/seq') // 创建模型(Model zd-user -> zd_users) const User = seq.define('zd-user',{ // id会被自动创建 user_name:{ type:DataTypes.STRING, allowNull:false, // 唯一的 unique:true, comment:'用户名,唯一' }, password:{ type:DataTypes.CHAR(30), unique:true, allowNull:false, comment:'密码' }, is_admin:{ type:DataTypes.BOOLEAN, allowNull:false, unique:true, comment:'0:不是管理员,1:管理员' } }) // 如存在表则删除后创建 // User.sync({force:true}) module.exports = User ``` ## 4.添加数据 改写`user.controller.js` ```js const {createUser} = require('../service/user.service') class UserController{ async register(ctx,next){ // 获取数据 const {user_name,password,is_admin} = ctx.request.body // 操作数据库 const res = await createUser(user_name,password,is_admin) // 返回结果 ctx.body = { code:0, message:'注册成功', result:{ id:res.id, user_name:res.user_name } } } } module.exports=new UserController() ``` 改写`user.service.js` ```js const User = require('../model/user.model') class UserService { async createUser(user_name,password,is_admin){ // // 插入数据 // await User.create({ // // 表的字段 // user_name:user_name // }) if(!is_admin){ is_admin = 1 } const res = await User.create({user_name,password,is_admin}) return res.dataValues } } module.exports = new UserService() ```