NodeJs实战-待办列表7-connect组件简化代码
- 什么是connect
- connect demo 程序
- conenct 应用到服务端
- 验证
- 添加
- 完成
什么是connect
connect demo 程序
- 安装 conncet、connect-query 组件
npm install connect
npm install connect-query
- 编写 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);
- 执行 node test_connect.js
F:\Github\Nodejs\todolist>node test_connect.js
- 浏览器访问如下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
- 思考: 如果把主程序修改一下
const app = connect();
app.use(logger)
.use(query())
.use('/', index)
.use('/hello', hello)
.use('/json', json)
.listen(3000);
启动服务之后还会得到和第4步一样的执行结果吗?
conenct 应用到服务端
需要修改 server.js
- 引入组件
const connect = require('connect');
const query = require('connect-query');
- 修改原来的 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;
}
}
- 增加日志拦截器 logger
function logger(request, response, next) {
console.log('%s %s', request.method, request.url);
// 打印完日志,执行下一个use方法
next();
}
- 增加校验拦截器 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();
}
- 增加connect启动服务
var app = connect();
app.use(logger)
.use(query())
.use(check)
.use(main)
.listen(3000);
- 完整的 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 获取参数的时候解码了