用nodejs搭建渠道跳转页面分发统计服务
2017-04-01 17:09
218 查看
用nodejs搭建渠道跳转页面分发统计服务,统计的数据主要在crate索引库中插入。
1、先介绍一下crate库
Crate Data 是一个开源的大规模的可伸缩的数据存储系统,无需任何系统管理需求。提供强大的搜索功能。用于存储各种表格数据、
非结构化数据和二进制对象,并可通过 SQL 进行检索。易于安装和使用,支持高可用性和实时大规模并行访问和处理。Crate 特别适合
用于 Docker 环境中。
2、首先要明白我们需要哪些数据,然后根据要记录的数据来设计索引库表结构,包括记录表和配置表,如图是我设计的表结构
3、然后开始用nodejs开始构建贴出主要的代码loginM.js
3、然后向crate库中插入数据由于crate库能直接以httpkpi的形式,操作表结构所以直接用request模块进行操作
插入的时候注意两点:
1、插入的时候要严格执行sql语句的语法
2、向crate库中插入数据的时候,要转换成字符串的格式插入
1、先介绍一下crate库
Crate Data 是一个开源的大规模的可伸缩的数据存储系统,无需任何系统管理需求。提供强大的搜索功能。用于存储各种表格数据、
非结构化数据和二进制对象,并可通过 SQL 进行检索。易于安装和使用,支持高可用性和实时大规模并行访问和处理。Crate 特别适合
用于 Docker 环境中。
2、首先要明白我们需要哪些数据,然后根据要记录的数据来设计索引库表结构,包括记录表和配置表,如图是我设计的表结构
3、然后开始用nodejs开始构建贴出主要的代码loginM.js
var request = require('request'); var url = require('url'); var moment = require('moment'); var Cookies = require('cookies'); var uuidV1 = require('uuid/v1');//通用唯一识别码 module.exports = { //返回地址参数信息主要用到url和moment模块 logic: function(req, res){ function urlInfo(urlhost){ return { href: url.parse(req.url).href, query: url.parse(req.url,true).query, pathname: url.parse(req.url,true).pathname, /*time: moment().format('YYYY-MM-DD HH:mm:ss'),*/ time: moment().format('X') } } var resInfo = urlInfo(); return resInfo; //res.write(resInfo.href+'~~~~'+resInfo.pathname+'~~~~'+resInfo.query.id+'~~~~'+resInfo.query.name+'~~~~'+resInfo.query.desc+'~~~~'+resInfo.time); }, //获取访问者的ip getClientIp: function(req){ var ipAddress; var headers = req.headers; var forwardedIpsStr = headers['x-real-ip'] || headers['x-forwarded-for']; forwardedIpsStr ? ipAddress = forwardedIpsStr : ipAddress = null; if (!ipAddress) { ipAddress = req.connection.remoteAddress; } return ipAddress; }, //判断用户的终端 checkClinetModel: function(req){ var device = ''; function brows($agent){ return { trident: $agent.indexOf('Trident') > -1, presto: $agent.indexOf('Presto') > -1, webKit: $agent.indexOf('AppleWebKit') > -1, gecko: $agent.indexOf('Gecko') > -1 && $agent.indexOf('KHTML') == -1, mobile: !!$agent.match(/AppleWebKit.*Mobile.*/), ios: !!$agent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), android: $agent.indexOf('Android') > -1 || $agent.indexOf('Linux') > -1, iPhone: $agent.indexOf('iPhone') > -1 || $agent.indexOf('Mac') > -1, iPad: $agent.indexOf('iPad') > -1, } } var deviceAgent=brows(req.headers['user-agent']); if (deviceAgent.trident){device = 'pc(Trident)';} if (deviceAgent.presto){device = 'pc(presto)';} if (deviceAgent.webKit){device = 'pc(webKit)';} if (deviceAgent.gecko){device = 'pc(gecko)';} if (deviceAgent.mobile && deviceAgent.ios){device = 'ios';} if (deviceAgent.mobile && deviceAgent.android){device = 'android';} if (deviceAgent.mobile && deviceAgent.iPhone){device = 'iPhone';} if (deviceAgent.mobile && deviceAgent.iPad){device = 'ipad';} return device; }, //给用户做标记这里主要用到uuid,然后存到cookie里面,来判断是不是同一个用户 setCookie: function(req, res){ req.cookies = new Cookies(req,res); var uuid = uuidV1();//生成唯一标识符 var c_uuido = req.cookies.get('uuidInfo'); if(c_uuido == undefined){ req.cookies.set('uuidInfo',uuid,{ maxAge:30 * 24 * 60 * 60 * 60, }); c_uuido = uuid; } return c_uuido; } }
3、然后向crate库中插入数据由于crate库能直接以httpkpi的形式,操作表结构所以直接用request模块进行操作
< 4000 span class="hljs-built_in">var request = require('request'); var logicM = require('./logic'); module.exports = { postCrate : function(req, res){ var setCookie = logicM.setCookie(req, res); var logic = logicM.logic(req, res); var getClientIp = logicM.getClientIp(req); var checkClinetModel = logicM.checkClinetModel(req); var data = { "name":logic.query.name, "descs":logic.query.descs, "href":logic.href, "pathname":logic.pathname, "ipaddress":getClientIp, "uuid":setCookie, "device":checkClinetModel, "time":logic.time, "resinfoid":logic.query.id, } request({ url: "crate库的接口地址", method: "POST", headers: { "content-type": "application/json", }, body: JSON.stringify({ "stmt": "insert into query (name, descs, href , pathname, ipaddress, uuid, device , time , resinfoid) values('"+data.name+"','"+data.descs+"','"+data.href+"','"+data.pathname+"','"+data.ipaddress+"','"+data.uuid+"','"+data.device+"','"+data.time+"','"+data.resinfoid+"') " }) }, function(error, response, body) { console.log(response.statusCode); if (!error && response.statusCode == 200) { if(error){ console.log(error); }else{ console.log('插入数据成功!'); } } }); } }
插入的时候注意两点:
1、插入的时候要严格执行sql语句的语法
2、向crate库中插入数据的时候,要转换成字符串的格式插入
相关文章推荐
- NodeJS搭建博客系统(二)构建一个markdown页面
- 使用nodejs搭建服务器显示HTML页面
- nodeJS搭建前端服务环境(适配开发工具eclipse及sublime Text)
- 使用nodejs、mongodb、express、linux搭建社区网站(3)-页面与路由
- nodejs搭建简易的rpc服务
- 通过NodeJS,Express搭建本地HTTP访问服务.
- 全面掌握Nginx配置+快速搭建高可用架构 一 开启status页面检测服务状态
- 页面跳转时,统计数据丢失问题探讨
- 使用nodejs为WebRTC+freeSWITCH搭建https服务
- nodejs -- 使用seneca模块搭建为服务
- [菜鸟试水]关于Nodejs搭建后台API服务(Mysql-Restify)
- nodejs 搭建https服务
- Nodejs搭建邮件自动发送服务
- eclipse搭建简单springboot-mybatis项目实现页面简单跳转
- 搭建VueJS2.9+ElementUI单页面网站,编写导航页,导航栏跳转、切换
- BLOG 搭建环境中出现的错误--注册页面跳转时出现
- 分享关于页面跳转和流量统计的问题。
- spring cloud-Swagger2整合Eureka,实现Eureka页面自动跳转到Swagger2UI界面查看服务接口信息
- 页面跳转时,统计数据丢失问题探讨
- 搭建nodejs服务,访问本地站点文件