NodeJs实战-待办列表(7)-connect组件简化代码

news2025/2/27 8:08:33

NodeJs实战-待办列表7-connect组件简化代码

  • 什么是connect
  • connect demo 程序
  • conenct 应用到服务端
  • 验证
    • 添加
    • 完成

什么是connect

在这里插入图片描述

connect demo 程序

  1. 安装 conncet、connect-query 组件
npm install connect
npm install connect-query
  1. 编写 demo 程序,保存到 test_connect.js 文件
const connect = require('connect');
const query = require('connect-query');

function logger(request, response, next) {
    console.log('%s %s', request.method, request.url);
    next();
}

function index(request, response) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.write('index');
    response.end();
}

function hello(request, response) {
    var data = request.query
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.write(JSON.stringify(data));
    response.end();
}

function json(request, response) {
    let data = {
        'code':'',
        'msg':''
    }
    data.code = 1;
    data.msg = 'hello world';
    response.writeHead(200, {'Content-Type': 'application/json;charset=UTF-8'});
    response.write(JSON.stringify(data));
    response.end();
}

const app = connect();
app.use(logger)
    .use(query())
    .use('/hello', hello)
    .use('/json', json)
    .use('/', index)
    .listen(3000);
  1. 执行 node test_connect.js
F:\Github\Nodejs\todolist>node test_connect.js
  1. 浏览器访问如下url 可以进入对应的执行方法(使用debug方式启动)
http://127.0.0.1:3000/hello?name=1111	=>  hello
http://127.0.0.1:3000/json	=> json
http://127.0.0.1:3000/ => index
  1. 思考: 如果把主程序修改一下
const app = connect();
app.use(logger)
    .use(query())
    .use('/', index)
    .use('/hello', hello)
    .use('/json', json)
    .listen(3000);

启动服务之后还会得到和第4步一样的执行结果吗?

conenct 应用到服务端

需要修改 server.js

  1. 引入组件
const connect = require('connect');
const query = require('connect-query');
  1. 修改原来的 http 创建服务的方法,改成main
function main(request, response) {
	var urlParse = parse(request.url);
	var urlPath = urlParse.pathname;
	var itemData = findItemData(request);
	switch (urlPath) {
		case '/':
			var filePath = 'public/index.html';
    		var absPath = './' + filePath;
			readFile(response, absPath);
			break;
		case '/query':
			doQuery(response);
			break;
		case '/add':
			doAdd(response, itemData);
			break;
		case '/complete':
			doCompelete(response, itemData);
			break;
	}
}
  1. 增加日志拦截器 logger
function logger(request, response, next) {
	console.log('%s %s', request.method, request.url);
	// 打印完日志,执行下一个use方法
	next();
}
  1. 增加校验拦截器 check
function check(request, response, next) {
	var urlParse = parse(request.url);
	var urlPath = urlParse.pathname;
	var itemData;
	if (urlPath == '/add' || urlPath == '/complete') {
		itemData = findItemData(request);
		if (itemData.length == 0) {
			var data = buildData(CODE_ERROR, [], '输入数据有误');
			return sendMsg(response, JSON.stringify(data));
		}
	}
	// 验证通过,执行下一个use 方法
	next();
}
  1. 增加connect启动服务
var app = connect();
app.use(logger)
	.use(query())
	.use(check)
	.use(main)
	.listen(3000);
  1. 完整的 server.js
const fs = require('fs');
const parse = require('url').parse;
const mysql = require('mysql');
const silly = require('silly-datetime');
const connect = require('connect');
const query = require('connect-query');
const db = mysql.createPool({
    host: "127.0.0.1",
    port: 3306,
    user: 'root',
    password: 'shootercheng',
    database: "test"
});

const hostname = '127.0.0.1';
const port = 3000;

const CODE_ERROR = 0;
const CODE_SUCCESS = 1;

function send404(response) {
    response.writeHead(404, {'Content-Type': 'text/plain'});
    response.write('Error 404: resource not found.');
    response.end();
}

function sendMsg(response, msg) {
	response.writeHead(200, {'Content-Type': 'application/json;charset=UTF-8'});
    response.write(msg);
    response.end();
}

function readFile(response, filePath) {
	fs.readFile(filePath, (err, data) => {
		if (err) {
			return send404(response);
		}
		var html = data.toString();
		// html = html.replace('%', Array.from(todoSet).join('</li><li>'));
		response.writeHead(200, {'Content-Type': 'text/html'});
		response.end(html);
	});
}

function findItemData(request) {
	var urlData = request.query;
	if (urlData.item != null) {
		return urlData.item;
	}
	return '';
}

function buildData(code, data, msg) {
	// 返回数据
	let retData = {
		'code':'',
		'data': [],
		'msg':''
	}
	retData.code = code;
	retData.data = data;
	retData.msg = msg;
	return retData;
}

/**
 * 获取当前时间
 * @returns
 */
function currentTime() {
    return silly.format(new Date(), 'YYYY-MM-DD HH:mm:ss');
}

/**
 * 格式日期
 * @param {*} date 
 * @returns 
 */
function formatDate(date) {
	if (date == null) {
		return "";
	}
	return silly.format(date, 'YYYY-MM-DD HH:mm:ss');
}

/**
 * 查询待办数据,并且输出到response
 * @param {*} response 
 */
function doQuery(response) {
	db.query('select item_name,create_time,complete_time,' + 
	'case todo_status when 0 then \'未完成\' when 1 then \'已完成\' end as todo_status from t_todo_list', (err, result) => {
		if (err) {
			console.log(err);
			var data = buildData(CODE_ERROR, [], '查询数据库失败');
			sendMsg(response, JSON.stringify(data));
			return;
		}
		var itemList = [];
		for (var i in result) {
			let item = {
				'itemName':'',
				'createTime':'',
				'completeTime':'',
				'todoStatus':''
			}
			item.itemName = result[i].item_name;
			item.createTime = formatDate(result[i].create_time);
			item.completeTime = formatDate(result[i].complete_time);
			item.todoStatus = result[i].todo_status;
			itemList.push(item);
		}
		var data = buildData(CODE_SUCCESS, itemList, '查询成功');
		sendMsg(response, JSON.stringify(data));
	});
}

/**
 * 添加待办事项
 * @param {*} response 
 * @param {*} itemData 
 */
function doAdd(response, itemData) {
	db.query('select count(*) as num from t_todo_list where item_name = ? and todo_status = ?', [itemData,'0'], (err, result) => {
        if (err) {
            console.log(err);
			var data = buildData(CODE_ERROR, [], '查询数据库失败');
			sendMsg(response, JSON.stringify(data));
			return;
        }
        if (result[0].num > 0) {
			var data = buildData(CODE_ERROR, [], itemData + '-待办事项已存在');
			sendMsg(response, JSON.stringify(data));
			return;
		}
		db.query('insert into t_todo_list(item_name, create_time, todo_status) values(?, ?, ?)', [itemData, currentTime(), '0'], (err, result) => {
			if (err) {
				console.log(err);
				var data = buildData(CODE_ERROR, [], itemData + '-待办事项添加到数据库失败');
				sendMsg(response, JSON.stringify(data));
				return;
			}
			doQuery(response);
		});
	});
}

/**
 * 完成待办事项
 * @param {*} response 
 * @param {*} itemData 
 */
function doCompelete(response, itemData) {
	db.query('select count(*) as num from t_todo_list where item_name = ? and todo_status = ?', [itemData, '0'], (err, result) => {
        if (err) {
            console.log(err);
			var data = buildData(CODE_ERROR, [], '查询数据库失败');
			sendMsg(response, JSON.stringify(data));
			return;
        }
        if (result[0].num == 0) {
			var data = buildData(CODE_ERROR, [], itemData + '-待办事项不存在');
			sendMsg(response, JSON.stringify(data));
			return;
		}
		db.query('update t_todo_list set complete_time = ?, todo_status = ? where item_name = ?', [currentTime(), '1', itemData], (err, result) => {
			if (err) {
				console.log(err);
				var data = buildData(CODE_ERROR, [], itemData + '-更新待办事项失败');
				sendMsg(response, JSON.stringify(data));
				return;
			}
			doQuery(response);
		});
	});
}

function logger(request, response, next) {
	console.log('%s %s', request.method, request.url);
	// 打印完日志,执行下一个use方法
	next();
}

function check(request, response, next) {
	var urlParse = parse(request.url);
	var urlPath = urlParse.pathname;
	var itemData;
	if (urlPath == '/add' || urlPath == '/complete') {
		itemData = findItemData(request);
		if (itemData.length == 0) {
			var data = buildData(CODE_ERROR, [], '输入数据有误');
			return sendMsg(response, JSON.stringify(data));
		}
	}
	// 验证通过,执行下一个use 方法
	next();
}


function main(request, response) {
	var urlParse = parse(request.url);
	var urlPath = urlParse.pathname;
	var itemData = findItemData(request);
	switch (urlPath) {
		case '/':
			var filePath = 'public/index.html';
    		var absPath = './' + filePath;
			readFile(response, absPath);
			break;
		case '/query':
			doQuery(response);
			break;
		case '/add':
			doAdd(response, itemData);
			break;
		case '/complete':
			doCompelete(response, itemData);
			break;
	}
}

var app = connect();
app.use(logger)
	.use(query())
	.use(check)
	.use(main)
	.listen(3000);

验证

添加

添加中文DDD
在这里插入图片描述

完成

完成中文DDD
在这里插入图片描述
在这里插入图片描述

可以看到日志中打印的item参数是经过编码的,connect-query 获取参数的时候解码了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里高工内产的 SpringBoot 实战派手册仅发布一天霸榜Github

近年来&#xff0c;Spring Boot 是整个Java社区中最有影响力的项目之一&#xff0c;常常被人看作是Java EE( Java Platform Enterprise Edition )开发的颠覆者&#xff0c;它将逐渐替代传统SSM ( Java EE互联网轻量级框架整合开发——Spring MvCSpringMyBatis&#xff09;架构。…

低代码平台的核心价值与优势

数字化时代的到来&#xff0c;迫使企业跳出舒适圈&#xff0c;坚定地踏上数字化转型的征程。不断飙升的用户需求&#xff0c;加上专业开发人员的显著缺口&#xff0c;让我们不得不承认&#xff0c;过去几十年的应用开发方式已经无法满足需求。低代码革命已经悄然开始&#xff0…

智慧防汛解决方案-最新全套文件

智慧防汛解决方案-最新全套文件一、建设背景行业痛点&#xff1a;1、家底不清&#xff0c;责权不分2、状态不明难以监管3、内外业脱节4、主观防涝二、建设思路面临的挑战&#xff1a;三、建设方案四、获取 - 智慧防汛全套最新解决方案合集一、建设背景 随着城市的快速发展&…

数据库的一级、二级、三级封锁协议

0、内容补充 X锁&#xff08;排他锁、写锁&#xff09; S锁&#xff08;共享锁、读锁&#xff09; 一、一级封锁协议 一级封锁协议是指&#xff0c;事务T在修改数据R之前必须先对其加X锁&#xff0c;直到事务结束才释放。事务结束包括正常结束&#xff08;COMMIT&#xff09;…

Kotlin Flow啊,你将流向何方?

前言 前边一系列的协程文章铺垫了很久&#xff0c;终于要分析Flow了。如果说协程是Kotlin的精华&#xff0c;那么Flow就是协程的精髓。 通过本篇文章&#xff0c;你将了解到&#xff1a; 什么是流&#xff1f;为什么引进Flow?Fow常见的操作为什么说Flow是冷流? 1. 什么是流 …

你必须要了解的国产数据库——OceanBase

文章目录前言1、什么是OceanBase&#xff1f;2、OceanBase名字的由来3、OceanBase 发展历程4、OceanBase优势5、OceanBase的核心特性6、应用场景7、未来展望前言 一直以来&#xff0c;外国企业在数据库领域保持高市占率&#xff0c;主流的数据库系统大多数都是使用外国的产品。…

读文章笔记-OSSFS-DD

读文章笔记-OSSFS-DD文章代码文章主要贡献内容公式(5)(6)的详细推倒对比其他7种算法算法思考文章 Online Scalable Streaming Feature Selection via Dynamic Decision 代码 https://github.com/doodzhou/OSFS 文章主要贡献 将特征分成选择&#xff0c;丢弃和延迟。提出基…

《第一行代码》核心知识点:Android的脸面之UI控件

《第一行代码》核心知识点&#xff1a;Android的脸面之UI控件前言三、Android的脸面之UI控件3.1 常用控件介绍3.1.1 TextView3.1.2 Button3.1.3 EditText3.1.4 ImageView3.1.5 ProgressBar3.1.6 AlertDialog3.1.7 ProgressDialog3.2 四种基本布局介绍3.2.1 线性布局3.2.2 相对布…

更强悍 更智能!飞凌嵌入式FET3588-C核心板震撼发布!

为提升AIoT领域终端设备的处理能力以及智能化程度&#xff0c;飞凌嵌入式与瑞芯微强强联手&#xff0c;正式推出FET3588-C核心板&#xff01; 1、国芯之光 品质之选 FET3588-C核心板基于Rockchip新一代旗舰RK3588处理器开发设计&#xff0c;采用先进的8nm制程工艺&#xff0c; …

【软考软件评测师】第三十一章 操作系统综合知识

【软考软件评测师】第三十一章 操作系统综合知识 第三十一章 操作系统综合知识【软考软件评测师】第三十一章 操作系统综合知识第一部分 知识点集锦1.嵌入式操作系统1&#xff09;可裁剪性2&#xff09;实时性3&#xff09;统一的接口4&#xff09;弱交互性5&#xff09;更好的…

EasyExcel使用详解与源码解读

EasyExcel使用详解1、EasyExcel简单介绍64M内存20秒读取75M(46W行25列)的Excel&#xff08;3.0.2版本&#xff09;2、EasyExcel和POI数据处理能力对比3、使用EasyExcel读写Excel、web上传/下载3.1、写EXCEL3.2、读EXCEL3.3、web上传、下载4、EasyExcel源码解读5、总结1、EasyEx…

AdsPower VS Dolphin,哪款指纹浏览器性价比更高?

现在指纹浏览器已经成为了跨境人必备的账号安全工具&#xff0c;市面上的指纹浏览器也非常多&#xff0c;但其实真正专业的寥寥无几。现在市场上比较出名的浏览器有AdsPower、Dolphin、multilogin。为了比较出AdsPower和Dolphin功能上的差异&#xff0c;龙哥特地去下载使用了这…

三、nginx设置浏览器缓存[expires]

一、浏览器缓存 解释&#xff1a;浏览器缓存极大缓解了带宽压力&#xff0c;提高了用户体验。 访问页面-查看是否有缓存&#xff0c;如果没有过期&#xff0c;直接击中缓存&#xff0c;不向服务器发送请求访问页面-查看是否有缓存&#xff0c;如果过期&#xff0c;向服务器发送…

如何给async await批量添加try…catch?

如何给async await批量添加try…catch&#xff1f;async和await是什么&#xff1f;如何给async await批量添加try…catchbabel插件的实现思路插件的基本格式示例寻找await节点向上查找 async 函数添加用户选项babel插件的安装使用其他参考资料async和await是什么&#xff1f; …

深紫色粉末BHQ-1 NHS,916753-61-2,NHS修饰是合成后与一个伯氨基的共轭

英文名称&#xff1a;BHQ-1 NHS CAS&#xff1a;916753-61-2 外观&#xff1a;深紫色粉末 分子式&#xff1a;C30H31N7O7 分子量&#xff1a;601.62 储存条件&#xff1a;-20C&#xff0c;避光避湿 结构式&#xff1a; 凯新生物产品简介&#xff1a; NHS修饰是合成后与一…

程序员必知必会网络传输之TCP/IP协议族,共864页的详解文档让你原地起飞!

我们现实网络无处不在&#xff0c;我们被庞大的虚拟网络包围&#xff0c;但我们却对它是怎样把我们的信息传递并实现通信的&#xff0c;我们并没有了解过&#xff0c;那么当我们在浏览器中出入一段地址&#xff0c;按下回车这背后都会发生什么&#xff1f; 比如说一般场景下&a…

ubuntu18.04安装QT5

ubuntu18.04安装QT5 1、说明 QT界面本不应该做为一个很高的知识点&#xff0c;问题是&#xff0c;越来越多的程序实验&#xff0c;需要界面支持&#xff0c;或用界面显得更加方便&#xff0c;因而专门启动该栏目专门介绍QT方法。因为体系比较庞大&#xff0c;因此&#xff0c;需…

在腾讯云 TKE 上部署 EMQX MQTT 服务器集群

云进入以「应用为中心」的云原生阶段&#xff0c;Operator 模式的出现&#xff0c;为 Kubernetes 中的自动化任务创建配置与管理提供了一套行之有效的标准规范。针对大规模分布式物联网 MQTT 消息服务器 EMQX 全生命期管理的自动化管理工具 EMQX Kubernetes Operator&#xff0…

11.数组的分类和定义

1.数组的概念 数组是若干个相同类型 的变量在内存中有序存储的集合。 int a[10];//定义了一个整型的数组a&#xff0c;a是数组的名字&#xff0c;数组中有10个元素&#xff0c;每个元素的类型都是int类型&#xff0c;而且在内存中连续存储。 这十个元素分别是a[0] , a[1] , … …

[附源码]java毕业设计鲜花销售管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…