node代理网络请求
server.js
 var express = require('express')
 var axios = require('axios')
 var port = 9000;
 var app = express();
 var allowCrossDomain = function (req, res, next) {
   res.header('Access-Control-Allow-Origin', '*');
   next();
 };
 app.use(allowCrossDomain);
 var apiRoutes = express.Router()
 apiRoutes.get('/getData', function (req, res) {
   var url = req.query.reqUrl;
   axios.get(url, {
     headers: {
       authority: 'https://xx.xx.xx/',
       cookie: 'xxxxxxxxxxxxx'
     },
     params: req.query
   }).then((response) => {
     res.json(response.data)
   }).catch((e) => {
     console.log(e)
   })
 })
 app.use(apiRoutes)
 module.exports = app.listen(port, function (err) {
   if (err) {
     console.log(err)
     return
   }
   console.log('Listening at http://localhost:' + port + '\n')
 })
index.html
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="layui-v2.4.5/css/layui.css">
</head> <body>
<div class="container">
<div class="input-box" style="padding:20px 20px 0 20px;">
<form class="layui-form layui-row" lay-filter="">
<div class="layui-input-inline layui-col-xs12 layui-col-sm6 layui-col-md3 layui-col-lg3">
<input type="text" name="title" required lay-verify="required" placeholder="请输入relatedId" autocomplete="off" class="layui-input" id="input" value="5624669de0f55a5286003b95">
</div>
<div class="layui-input-inline" style="padding:5px 0 0 20px;">
<div class="layui-btn layui-btn-sm layui-btn-normal" id="confirm">搜索</div>
</div>
</form>
</div>
<div class="table-box" style="padding:0 20px;">
<table class="layui-table">
<colgroup>
<col width="400">
<col>
</colgroup>
<thead>
<tr>
<th>错误摘要</th>
<th>应用版本</th>
<th>最近发生时间</th>
<th>最后发生时间</th>
<th>错误次数</th>
<th>影响用户数</th>
</tr>
</thead>
<tbody id="templateTbody"></tbody>
</table>
</div>
</div>
<script id="tmpl" type="text/html">
{{# layui.each(d.data, function(index, item){ }}
<tr>
<td>{{item.summary}}</td>
<td>{{item.appVersion}}</td>
<td>{{item.firstHappenTime}}</td>
<td>{{item.lastHappenTime}}</td>
<td>{{item.happenTimes}}</td>
<td>{{item.affectUsers}}</td>
</tr>
{{# }); }}
{{# if(d.data.length === 0){ }}
暂无数据
{{# } }}
</script>
<script src="layui-v2.4.5/layui.js"></script>
<script src="index.js"></script>
</body> </html>
index.js
 layui.use(['form', 'jquery', 'laytpl', 'layer'], function() {
     var form = layui.form;
     var $ = layui.jquery;
     var laytpl = layui.laytpl;
     var layer = layui.layer;
     $('#confirm').on('click', function() {
         var id = $.trim($('#input').val());
         if (!id) {
             layer.msg('请输入relatedId');
             return;
         };
         var reqUrl = getUrl(id);
         sendReq(reqUrl);
     })
     function getUrl(id) {
         var date = new Date().toLocaleString();
         var date1 = date.split(' ')[0].replace(/\//g, '');
         var date2 = date.split(' ')[1].replace(/:/g, '');
         return `https://mobile.umeng.com/ht/api/qb/v1/error/search?versions=&startDay=${date1}+000000&endDay=${date1}+${date2}&exValue=&exField=abstract&relatedId=${id}&errorClass=1&pageSize=120&page=1`;
     }
     function sendReq(reqUrl) {
         console.log(reqUrl);
         $.ajax({
             url: 'http://127.0.0.1:9000/getData',
             data: { reqUrl: reqUrl },
             success: function(ret) {
                 if (ret.code === 200) {
                     var data = ret.data;
                     data.data = normalize(data.data);
                     var getTpl = tmpl.innerHTML;
                     var view = document.getElementById('templateTbody');
                     laytpl(getTpl).render(data, function(html) {
                         view.innerHTML = html;
                     });
                 } else {
                     layer.msg('请求错误:' + ret.msg);
                 }
             }
         })
     }
     function normalize(data) {
         $.each(data, function(i, e) {
             e.firstHappenTime = new Date(e.firstHappenTime).toLocaleString();
             e.lastHappenTime = new Date(e.lastHappenTime).toLocaleString();
             if (e.summary.indexOf('\n') > -1) {
                 e.summary = e.summary.slice(0, e.summary.indexOf('\n'));
             }
         })
         return data;
     }
     Date.prototype.toLocaleString = function() {
         function addZero(num) {
             if (num < 10)
                 return "0" + num;
             return num + '';
         }
         return this.getFullYear() + "/" + addZero(this.getMonth() + 1) + "/" + addZero(this.getDate()) + " " +
             addZero(this.getHours()) + ":" + addZero(this.getMinutes()) + ":" + addZero(this.getSeconds());
     };
 })
node代理网络请求的更多相关文章
- AndroidInject项目使用动态代理增加对网络请求的支持
		
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3540427.html AndroidInject项目是我写的一 ...
 - [爬虫进阶]使用Jsoup取代你的一切网络请求方法(java,post,get,代理IP)
		
[爬虫进阶]使用Jsoup取代你的一切网络请求方法(java,post,get,代理IP) 原文链接:https://www.cnblogs.com/blog5277/p/9334560.html 原 ...
 - android通过fiddler代理,抓取网络请求
		
安装fiddler过程省略 1, 2, 3, 4,手机需要跟电脑处于同一局域网,设置网络代理为电脑在局域网内的ip,端口为3步设置的port 5,电脑就可以通过fiddler监控手机的所有网络请求了( ...
 - iOS_网络请求_代理方式
		
#pragma mark - 网络请求代理方式(异步) - (IBAction)DelegateButtonDidClicked:(UIButton *)sender { // 1.拼接 urlStr ...
 - 十. Axios网络请求封装
		
1. 网络模块的选择 Vue中发送网络请求有非常多的方式,那么在开发中如何选择呢? 选择一:传统的Ajax是基于XMLHttpRequest(XHR) 为什么不用它呢?非常好解释配置和调用方式等非常混 ...
 - Jest中Mock网络请求
		
Jest中Mock网络请求 最近需要将一个比较老的库修改为TS并进行单元测试,修改为TS还能会一点,单元测试纯粹是现学现卖了,初学Jest框架,觉得在单元测试中比较麻烦的就是测试网络请求,所以记录一下 ...
 - Android之三种网络请求解析数据(最佳案例)
		
AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...
 - 【Swift】Alamofile网络请求数据更新TableView的坑
		
写这篇BLOG前,有些话不得不提一下,就仅当发发恼骚吧... 今天下午为了一个Alamofire取得数据而更新TableView的问题,查了一下午的百度(360也是见鬼的一样),竟然没有一个简单明了的 ...
 - nginx android app 慢网络请求超时
		
最近遇到了android 在慢网络下面请求服务器报 java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by ...
 
随机推荐
- ETL Automation完整安装方法_(元数据存放在mysql数据库)
			
安装前介质准备: DBI-1.636.tar.gz DBD-mysql-4.037.tar.gz ETL.tar mysql-5.6.12-linux-glibc2.5-x86_64.tar.gz P ...
 - ORACLE SQL性能优化(全)
			
ORACLE SQL性能优化(全) http://wenku.baidu.com/view/b2aaba3887c24028915fc337.html
 - 搭建React Native开发环境
			
搭建React Native开发环境 本文档是Mac下搭建的环境,针对的目标平台不同,以及开发 iOS 和 Android 的不同,环境搭建也有差异. Github地址:https://github. ...
 - C# 操作World生成报告
			
直接上代码 using System; using System.IO; using System.Data; using Word = Microsoft.Office.Interop.Word; ...
 - VS2005 调试不能设置断点的解决办法
			
[ 1] 以前也遇到过同样的问题,但没有问个为什么,也没有探个毕竟.昨天调试一个DLL,添加输出信息吧,太麻烦而且不轻易定位, 但设置断点后按“F5”,断点不可用,气泡提示“当前不会命中断点,还没有为 ...
 - Android-addToBackStack使用和Fragment执行流程
			
文章来源:https://blog.csdn.net/wenxuzl99/article/details/16112725 在使用Fragment的时候我们一般会这样写: FragmentTransa ...
 - input光标位置
			
兼容谷歌火狐-input光标位置 input框在没有添加任何效果的情况下,输入文字后光标始终在最后的位置,谷歌||火狐效果一样 但是在给input加入点击事件后 谷歌:input框插入文字后,光标会自 ...
 - launchMode之的几种取值
			
Activity的launchMode launchMode之standard ·标准模式.每次激活Activity时均在当前任务栈中创建新的实例. 在配置文件里把activity节点的属性配置为 ...
 - Linux就该这么学--命令集合4(文件目录管理命令)
			
1.touch命令用于创建空白文件与修改文件时间:(touch [选项] [文件]) 对于在Linux中的文件有三种时间: 更改时间(mtime):内容修改时间(不包括权限的) 更改权限(ctime) ...
 - SecureCRT中使用VBs脚本自动telnet登陆
			
查看SecureCRT帮助文档: Help-> Help Topics->Scripting -> Script Objects Reference -> Session Ob ...