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

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

什么是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 获取参数的时候解码了

猜你喜欢

转载自blog.csdn.net/modelmd/article/details/127974136