express 框架下使用mysql 保存页面抓取的数据

来源:互联网 发布:java set集合 编辑:程序博客网 时间:2024/06/06 02:18

通过 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);        });    });




0 0
原创粉丝点击