第二天:继续完善路由层(router)及数据层(controller)
上一篇
接着上一篇完善路由
一、创建数据模型
作用:统一规定返回数据到客户端时,数据的格式保存一致
- 在src文件下创建model文件夹并在其目录下创建resModel.js文件
class BaseModel {/*data是返回到客户端的数据(对象类型),message是错误信息(字符串类型)如果errno=0,请求成功 通过data来获取数据如果errno=-1,请求失败 通过message来获取错误的具体原因*/constructor(data, message) {//兼容(第一个参数(data)没有传递,只传递第二个参数)if (typeof data === 'string'){//将错误信息赋值给了messagethis.message = datadata = nullmessage = null}//赋值if (data) {this.data = data}if(message) {this.message = message}}
}//请求成功
class SuccessModel extends BaseModel {constructor(data,message) {super(data, message)this.errno = 0}
}//请求失败
class ErrorModel extends BaseModel {constructor(data, message) {super(data, message)this.errno = -1}
}module.exports={SuccessModel,ErrorModel
}
二、优化查看博客列表
- 完善app.js文件(获取get参数)
//在原有代码基础上添加下面代码//获取get参数 (查看博客列表时需要作者author和keyword)
const querystring = require('querystring')
//将参数存放在req中的对象query中
req.query = querystring.parse(url.split('?')[1])
- 在src目录下创建controller文件夹,并创建blog.js文件
原由:controller文件夹是用来存放控制获取数据的文件
// src/controller/blog.jsconst getList = (author,keyword) => {//先返回假数据(格式正确)return [{id:1,title:'标题A',content:'内容A',createTime:1546610491112,author:'zhangsan'},{id:2,title:'标题B',content:'内容B',createTime:1546610524373,author:'lisi'}]
}module.exports = {getList
}
- 完善获取博客列表的路由
// src/router/blog.js
const {getList} = require('../controller/blog.js')
const {SuccessModel,ErrorModel} = require('../model/resModel.js')if (method === "GET" && req.path === "/api/blog/list") {//获取请求数据 (req.query已经在app.js文件中已经保存好了)const author = req.query.author || ''const keyword = req.query.keyword || ''//去请求博客列表数据const listData = getList(author,keyword)return new SuccessModel(listData)}
- 测试
三、优化获取博客详情
- 在controller文件夹中的blog.js文件完善代码
const getDetail = (id) => {//先返回假数据(格式正确)return [{id:1,title:'标题A',content:'内容A',createTime:1546610491112,author:'zhangsan'}]
}
//在将方法其导出
- 完善获取博客详情的路由
// src/router/blog.js
if (method === "GET" && req.path === "/api/blog/detail") {const id = req.query.id || ''//去请求数据const detail = getDetail(id)return new SuccessModel(detail)}
- 测试
接下来是解决post请求,但这里有一个小问题就是post发送的数据在服务端读取的时候是异步的,异常需要对其进行修改成同步的,具体解决方法点击这里
四、优化读取post data数据(Promise)
// app.js 重新创建一个函数用于处理post数据const getPostData = (req) => {const promise =new Promise((resolve, reject) => {if(req.method !== "POST") {resolve({})return}if(req.headers['content-type'] !== 'application/json') {resolve({})return}//接收数据let postData=""req.on("data", chunk =>{postData += chunk.toString()})req.on('end', chunk => {if(!postData) {resolve({})return}resolve(JSON.parse(postData))})})return promise
}
在app.js中的serverHandle函数调用该函数(先调用该函数,在进行路由转发)
getPostData(req).then(postData => {req.body = postData//处理 blog 路由const blogData = handleBlogRouter(req, res)if (blogData) {res.end(JSON.stringify(blogData))return}//处理user路由const userData = handleUserRouter(req, res)if (userData) {res.end(JSON.stringify(userData))return}//未命中路由,返回404res.writeHead(404, { "Content-type": "text/plain" })res.write("404 Not Found\n")res.end()})
五、优化新建博客和更新博客
- 在controller文件夹中的blog.js文件完善代码
const newBlog = (blogData ={}) => {//blogData 是一个博客对象,包含 title content 属性return {id:3 //表示新建博客,插入到数据库表里面的id}
}
//在将方法其导出
- 完善新建博客的路由
//新增一篇博客if (method === "POST" && req.path === "/api/blog/new") {//获取post请求数据 (app.js中已经获取到了)const postData = req.bodyconst id = newBlog(postData)return new SuccessModel(id)}
- 新增功能测试
接下来是更新功能,因为更新功能需要博客的id并且是该参数是添加在url中的,而前面的获取博客详情也是添加在url中,故可以在handleBlogRouter全局下去获取博客id
- 在controller文件夹中的blog.js文件完善代码
const updateBlog = (id,blogData ={}) => {//id 就是要更新博客的 id//blogData 是一个博客对象,包含 title content 属性return true
}
//在将方法其导出
- 完善更新博客的路由
//更新一篇博客if (method === "POST" && req.path === "/api/blog/update") {//获取post请求数据 (app.js中已经获取到了)const postData = req.bodyconst result = updateBlog(id, postData)if(result) {return new SuccessModel(result)}return new ErrorModel('更新博客失败')}
- 更新功能测试
六、优化删除博客和登录
- 在controller文件夹中的blog.js文件完善代码
const delBlog = (id) => {//id 就是要删除博客的 idreturn true
}
//在将方法其导出
- 完善删除博客的路由
//删除一篇博客if (req.method === "POST" && req.path === "/api/blog/del") {const result = delBlog(id)if (result) {return new SuccessModel(result)} return new ErrorModel('删除博客失败')}
- 在controller文件夹中的user.js文件完善代码
const loginCheck = (username,password) => {//先用假数据if (username === 'zhangsan' && password === '123') {return true}return false
}
module.exports = loginCheck
- 完善登录的路由
// router/user.js
const loginCheck = require('../controller/user')
const { SuccessModel,ErrorModel} = require ('../model/resModel')
const handleUserRouter = (req, res) => {const method = req.method//登录if (method === "POST" && req.path === "/api/user/login") {const postData = req.bodyconst {username,password} = postDataconst result =loginCheck(username,password)if (result) {return new SuccessModel(result)}return new ErrorModel('登录失败')}
}
module.exports = handleUserRouter
- 登录测试
下一篇,篇尾可以下载源码哦!!!!!
欢迎访问我的个人博客
第二天:继续完善路由层(router)及数据层(controller)相关推荐
- 数据仓库之【用户行为数仓】06:【dwd层】明细数据层:清洗ods层之后的数据
一.dwd层分析 下面我们来创建dwd层: 针对ods层表中的数据进行清洗,参考数据清洗规则,按照实际情况对数据进行清洗. 注意:如果清洗规则使用SQL可以实现,那么就使用SQL实现数据清洗,如果清洗 ...
- php 数据中心,数据层 · Thinkphp 独立数据中心使用手册 · 看云
[TOC] ## 概述 数据层是用来直接操作数据表的,数据层的方法都是原子的操作,应避免在数据层中处理具体业务流程,具体业务流程应在逻辑层进行处理. ## 数据层类定义 数据层类通常需要继承核心的\t ...
- 表示层 业务逻辑层 数据层(UI BLL DAL)
表示层不能直接控制数据层,一定要通过业务层去和数据层打交道 转载于:https://www.cnblogs.com/xjt360/p/3899399.html
- 浅谈网页三层结构:表现层、业务层和数据层
转自:微点阅读 https://www.weidianyuedu.com 网页设计 三层结构 表现层.业务层和数据层 1. 表现层(Presentation Layer): 表现层用于用户接口的展示 ...
- HarmonyOS鸿蒙学习笔记(2)路由ohos.router的使用
ohos.router路由入门指南 前言 路由跳转传递和接收参数 参考资料 前言 本文以eTS-3.1.6.6位版本来说明ohos.router的使用,重点来说明ohos.router怎么传递和接收参 ...
- 【Vue路由(router)进一步详解】
Vue路由(router)进一步详解 query属性 具体实例代码如下: params属性 具体实例代码如下: props属性 replace属性 编程式路由导航 路由缓存 具体代码: 总结 本篇文章 ...
- VUE探索第三篇-路由(vue router)
一.vue router介绍 Vue Router是Vue.js官方的路由器,页面间的跳转(比如A->B->C)是一组路由,而Vue Router是管理这些路由的集成器.Vue Route ...
- 路由(Router)
路由(Router) Router 主要用来描述请求 URL 和具体承担执行动作的 Controller 的对应关系, 框架约定了 app/router.js 文件用于统一所有路由规则. 通过统一的配 ...
- OSI七层模型及各层作用
OSI模型,即开放式通信系统互联参考模型,是国际标准化组织提出的一个试图是各种计算机或者通信系统在世界范围内互联为网络的标准框架.整个模型分为七层,物理层,数据链路层,网络层,传输层,会话层,表示层, ...
- 设计数据层组件并在层间传递数据
Angela Crocker.Andy Olsen 和 Edward Jezierski Microsoft Corporation 2002年8月 适用于: Microsoft® .NET ...
最新文章
- 织梦怎么改网站主页php,无忧主机教你修改织梦DedeCms网站首页为动态显示的方法...
- 网络安全系列之五十二 组策略中的软件限制策略
- oracle 动态sql列转行_oracle行转列(动态行转不定列)
- 淘宝 oracle mysql_Oracle 与 MySQL 的区别-阿里云开发者社区
- .NET两种图片上传方式
- STM32复位源判断
- 研究所月入两万?见过越上班工资越少的骚操作吗...
- admin ajax,如何在FastAdmin中使用Ajax发送请求?
- 【毫米波雷达】人体目标探测理论
- Sybase数据库知识总结
- Python官方中文文档网址和Python标准库官方中文文档网址
- Solaris系统cron服务异常解决记录
- 第十二节 JS事件高级应用
- 矩阵可逆的条件以及特征值、特征向量与可对角化条件
- 校园网共享网络(Netkeeper 飞young )
- 2017 北京商改住政策
- 通过指令获取tsc标签打印机的状态
- 基于pytorch+python实现一个中文到英文的神经网络的翻译模型
- Ubuntu18.04安装教程(很详细)
- 京东金融java面试题_互联网金融西部联盟
热门文章
- android系统功耗问题:systrace
- maven解决依赖冲突
- python c语言实现 书_用C语言实现python的扩展模块
- register 寄存器变量
- ssm框架返回html,ssm框架controller层返回json格式数据到页面
- linux命令查bin中所有变量名,Linux--文件查找命令
- c语言统计计算机专业人数,非计算机专业C语言练习题及2013版中国统计年鉴1.doc...
- redis mysql 数据长度_如何统计Redis中各种数据的大小
- 如何实现消息功能_微信多个群转发消息如何实现?多群转发小助手转播云端转播功能怎样操作?...
- 大数据如何学习 cda认证_大数据学习之学习要求