通过 nodejs 抓取的页面信息进行解析保存到数据库
抓取页面功能http://blog.csdn.net/black_wizard/article/details/51701101
保存到数据库
var itemDO = json_obj.itemDO;
var date = new Date();
var curtime = date.getTime()/1000;// 当前时间戳
itemDO['time'] = curtime;
itemDO['fromurl'] = response.request.uri.href;//抓取的页面地址
goodsModel.add(res,itemDO, 'pc');//pc端和移动端抓取的页面解析规则不同
//itemDO保存成功后,执行
var skuList = json_obj.valItemInfo.skuList;
var skuMap = json_obj.valItemInfo.skuMap;
var len = skuList.length,
i = 0;
for (var key in skuList) {
skuList[key]['itemId'] = json_obj.itemDO.itemId;
skuList[key]['stock'] = skuMap[';'+skuList[key]['pvs']+';']['stock'];
skuList[key]['price'] = skuMap[';'+skuList[key]['pvs']+';']['price'];
skuList[key]['priceCent'] = skuMap[';'+skuList[key]['pvs']+';']['priceCent'];
skusModel.add(res,skuList[key], 'pc'); //保存规格
}
CRUD语句
// CRUD SQL语句
var goods = {
insert:'INSERT INTO goods(itemId, json_data,type,quantity,title,createtime,fromurl) VALUES(?,?,?,?,?,?,?)',
update:'update goods set json_data=?,quantity=?,title=?,updatetime=? where itemId=?',
delete: 'delete from goods where itemId=?',
queryById: 'select * from goods where itemId=?',
queryAll: 'select * from goods'
};
module.exports = goods;
// goodsModel
// 实现与MySQL交互
var mysql = require('mysql');
var $conf = require('../conf/db');
var $util = require('../util/util');
var $sql = require('./goodsSqlMapping');
// 使用连接池,提升性能
var pool = mysql.createPool($util.extend({}, $conf.mysql));
// 向前台返回JSON方法的简单封装
var jsonWrite = function (res, ret) {
if(typeof ret === 'undefined') {
res.json({
code:'1',
msg: '操作失败'
});
} else {
res.json(ret);
}
};
module.exports = {
add: function (res,params,type) {
pool.getConnection(function(err, connection) {
// 获取前台页面传过来的参数
var str = JSON.stringify(params);
// 建立连接,向表中插入值
// 'INSERT INTO user(itemId, json_data) VALUES(?,?)',
connection.query($sql.insert, [params.itemId, str,type,params.quantity,params.title,params.time,params.fromurl], function(err, result) {
if(result) {
result = {
status: 1,
msg:'增加成功'
};
}else{
result = {status:0,msg:err};
}
// 以json形式,把操作结果返回给前台页面
// jsonWrite(res, result);
// 释放连接
connection.release();
});
});
},
queryAll:function(req, res, next){
return new Promise(function(resolve, reject){
pool.getConnection(function(err, connection) {
var queryAll = connection.query($sql.queryAll, function(err, result) {
connection.release();
if(!result){
reject({
result_code:-1,
status:0,
msg:'获取商品列表失败!'
});
return;
}else{
resolve(result);
}
});
});
});
}
};
由于nodejs 是异步编程模式, 不会等待成功保存到数据库后再执行skus的保存操作,对goods的保存结果无法判断,发现可以使用Promise、根据异步调用的返回结果(resolve正确返回结果和reject错误处理))判断接下来的操作..queryAll 就是采用Promise模式
参考promise http://liubin.org/promises-book/#chapter2-how-to-write-promise
var promise = new Promise(function(resolve, reject){
goodsModel.queryAll(req, res, next).then(function(result){//result即查询结果
result.forEach(function(item){ console.log(item);res.json(item) });
}).catch(function(err){// err 即{result_code:-1,status:0, msg:'获取商品列表失败!'}
reject(err);
});
});