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

通过 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值