Node.js开发博客项目笔记-初始化路由(博客列表、新增、更新、删除、详情、登录)(3)
工程目录
如图所示,工程目录如下:

我们在工程下新建src的目录,src目录下新建三个文件夹:
- controller:交互数据放到该目录下;
- model:model类放到该目录下;
- router:路由(模块接口处理)放到该目录下。
model目录
我们在model目录下,新建一个resModel.js,代码如下:
class BaseModel {
constructor(data,message) {
if(typeof data === 'string') {
this.message = data;
data = null;
message = 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
}
其作用就是对接口返回的数据做下拦截处理,对于返回成功或者失败的接口,我们除了返回响应的message,再整体添加一个errno状态码,其中errno返回0表示成功;errno返回-1表示失败。
controller目录
我们在controller目录下新建两个js的文件,把开发的这个博客项目分成两个模块:
- blog.js:(博客列表、添加博客、更新博客、删除博客、博客详情
- user.js:(目前只有登录)
当前两个的模块的数据都是假数据,blog.js代码如下:
// 获取博客列表
const getList = (keyword, author) => {
// 返回假数据
return [
{
id: 1,
title: '标题A',
content: '博客内容A',
createTime: 1630630964139,
author: 'zhangsan'
},
{
id: 2,
title: '标题B',
content: '博客内容B',
createTime: 1630630999550,
author: 'lisi'
}
]
} // 获取博客详情
const getDetail = (id) => {
// 返回假数据
return {
id: 1,
title: '标题A',
content: '博客内容A',
createTime: 1630630964139,
author: 'zhangsan'
}
} // 新建博客
const newBlog = (blogData = {}) => {
return {
id: 3
}
} // 更新博客
const updateBlog = (id) => {
return true;
} // 删除博客
const delBlog =(id) => {
return true;
} module.exports = {
getList,
getDetail,
newBlog,
updateBlog,
delBlog
}
user.js代码如下:
const loginCheck = (username,password) => {
// 使用假数据
if(username === 'zhangsan' && password === '123') {
return true;
}
return false;
}
module.exports = {
loginCheck
}
router目录
router目录下也是分成两个路由模块:
- blog.js:博客相关的路由接口处理操作;
- user.js:用户相关(目前只有登录接口)的路由接口处理操作。
blog.js代码如下:
const { getList, getDetail, newBlog,updateBlog,delBlog } = require('../controller/blog');
const { SuccessModel, ErrorModel } = require('../model/resModel');
const handleBlogRouter = (req, res) => {
const method = req.method;
const id = req.query.id;
// 获取博客列表
if (method === 'GET' && req.path === '/api/blog/list') {
let keyword = req.query.keyword;
let author = req.query.author;
let resData = getList(keyword, author);
return new SuccessModel(resData)
}
// 获取博客详情
if (method === 'GET' && req.path === '/api/blog/detail') {
let id = req.query.id;
let resData = getDetail(id);
return new SuccessModel(resData);
}
// 新建博客
if (method === 'POST' && req.path === '/api/blog/new') {
const data = newBlog(req.body);
return new SuccessModel(data);
}
// 更新博客
if (method === 'POST' && req.path === '/api/blog/update') {
const result = updateBlog(id);
if(result) {
return new SuccessModel();
} else {
return new ErrorModel('更新博客失败');
}
}
// 删除博客
if (method === 'POST' && req.path === '/api/blog/del') {
const result = delBlog(id);
if(result) {
return new SuccessModel();
} else {
return new ErrorModel('删除博客失败');
}
}
}
module.exports = handleBlogRouter;
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 { username,password } = req.body;
const result = loginCheck(username,password);
if(result) {
return new SuccessModel();
} else {
return new ErrorModel('登录失败');
}
}
}
module.exports = handleUserRouter;
app.js
对node服务的处理代码如下:
const querystring = require('querystring');
const handleBlogRouter = require('./src/router/blog');
const handleUserRouter = require('./src/router/user');
// 处理post data
const getPostData = (req) => {
return 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', () => {
if(!postData) {
resolve({});
return;
}
resolve(JSON.parse(postData));
})
})
}
const serverHandle = (req,res) => {
res.setHeader('Content-type','application/json');
// 获取path
const url = req.url;
req.path = url.split('?')[0];
req.query = querystring.parse(url.split('?')[1]);
// 处理post data
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;
}
// 未命中路由 返回404
res.writeHead(404, {'Content-type': 'text/plain'});
res.write('404 not found \n');
res.end();
})
}
module.exports = serverHandle;
Node.js开发博客项目笔记-初始化路由(博客列表、新增、更新、删除、详情、登录)(3)的更多相关文章
- 《node.js开发指南》读书笔记(一)
在开发时如果修改了js内容,不能通过刷新浏览器直接看到效果,必须通过重启nodejs程序才能看到,这样显然不利于开发调试,supervisor可以实现这个功能,监视对代码的改动,并自动重启nodejs ...
- 学习Nodejs:《Node.js开发指南》微博项目express2迁移至express4过程中填的坑
<Node.js开发指南>项目地址https://github.com/BYVoid/microblog好不容易找到的基础版教程,但书中是基于express2的,而现在用的是express ...
- 基于.NetCore开发博客项目 StarBlog - (4) markdown博客批量导入
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- 《Node.js开发实战详解》学习笔记
<Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...
- Node.js学习笔记——Node.js开发Web后台服务
一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...
- Nodejs学习笔记(一)--- 简介及安装Node.js开发环境
目录 学习资料 简介 安装Node.js npm简介 开发工具 Sublime Node.js开发环境配置 扩展:安装多版本管理器 学习资料 1.深入浅出Node.js http://www.info ...
- Nodejs学习笔记(一)—简介及安装Node.js开发环境
一.简介 Node.js是让Javascript脱离浏览器运行在服务器的一个平台,不是语言: Node.js采用的Javascript引擎是来自Google Chrome的V8:运行在浏览器外不用考虑 ...
- ES6 学习笔记 (2)-- Liunx环境安装Node.js 与 搭建 Node.js 开发环境
笔记参考来源:廖雪峰老师的javascript全栈教程 一.安装Node.js 目前Node.js的最新版本是6.2.x.首先,从Node.js官网下载对应平台的安装程序. 1.下载 选择对应的Liu ...
- mac下配置Node.js开发环境、express安装、创建项目
mac下配置Node.js开发环境.express安装.创建项目 一.node.js的安装 去官网下载对应的平台版本就可以了,https://nodejs.org 二.express安装 sudo n ...
- 【转】Nodejs学习笔记(一)--- 简介及安装Node.js开发环境
目录 学习资料 简介 安装Node.js npm简介 开发工具 Sublime Node.js开发环境配置 扩展:安装多版本管理器 学习资料 1.深入浅出Node.js http://www.info ...
随机推荐
- 算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、Optuna、多目标优化、异步并行优化
大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 今日 215/10000 为模型找到最好的超参数是机器学习实践中最困难的部分之一 ...
- 透视开源生态,OSGraph——GitHub全域数据图谱的智能洞察工具
"透视开源生态,OSGraph--GitHub全域数据图谱的智能洞察工具 OSGraph (Open Source Graph) 是一个开源图谱关系洞察工具,基于GitHub开源数据全域图谱 ...
- 洛谷P1077
这道题和上一道题也是比较像的,基本采用的也是线性dp的思路 状态数组稍微有点不同,这里表示的是当前种数的花时一共的花的数量 #include<iostream> #include<u ...
- UE Spline 样条网格体组件添加碰撞
最近做的一个功能是通过Spline 生成管道模型. 如下图所示: 遇到的一个问题是需要给生成的管路加上碰撞.其中需要两个重要的步骤: 设置SplineMeshComponent的碰撞预设 找到&quo ...
- [oeasy]python0129_unicode_中文字符序号_十三道大辙_字符编码解码_eval_火星文
unicode 中文字符分类 回忆上次内容 字符集 从博多码 到 ascii 再到 iso-8859 系列 各自割据 如何把世界上各种字符统进行编码 unicode顺势而生不断进化 不过字符总量超 ...
- oeasy 教您玩转 linux 010400 总结 summary
###### 上一部分我们都讲了什么?* 各种gui* qt和gdk两个开源工具跨平台开发库* 发行版和gui之间的关系###### 我们一起来回顾一下整个学习过程* 我们从零开始* ...
- wails实现腾讯元器bot
简单记录工具的一个模块 后端 Api调用 登录 腾讯元器 后创建智能体,按自己的需求来创建,发布后要等等审核. 等发布完成后点击调用api即可,这里可以看到user_id, assistant ...
- [rCore学习笔记 02]Ubuntu 22虚拟机安装
写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 Ubu ...
- RSA加解密,Java和C#互通
一.使用场景 Java作为服务端生成一对公私钥,C#作为客户端拥有公钥. RSA算法这里就不多做介绍了,可参考RSA算法介绍 二.规范 公私钥的形式都是base64字符串 通过公私钥加密后的字符串也是 ...
- Scratch植物大战僵尸全套素材包免费下载
scratch植物大战僵尸全套素材包,包含227个丰富多样的素材,涵盖角色.背景.动态gif.为Scratch创作者提供丰富资源,助力创作精彩作品. 免费下载地址:www.xiaohujing.com ...