Request模拟报文发送

Request作者昨天多用来测试本人写的api,差不多使用:

  • get方法
  • post方法

如故直接上代码

var request = require('request');

///这里就是设置一下参数了
var options = {
    //url不必说了,发向那个就写那个,这里是我的一个例子
    url: 'http://localhost:3000/commodityManage/purchaseAdd',
    //报文头,这里就是按需填写了,我因为希望发送和接收都是json格式,所以这么写
    //一般为了安全会在报文头加token,这里你也是可以模拟的,可以去浏览器抓取请求报文,能理解的更深一些
    headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    },
    //这里就是填写数据了,我这里使用的是post方法,get的话是不用加的,json格式大家应该看的懂吧
    form: {
        'commodityList': [
            {
                'commodityName': '坦克杯',
                'commodityId': '4',
                'commodityPrice': 79999,
                'commodityNumber': 1
            },
            {
                'commodityName': '飞机杯',
                'commodityId': '5',
                'commodityPrice': 128,
                'commodityNumber': 1
            }
        ],
        'purchasePrice': 79999,
        'userId': '2'
    }
};

//这里为了方便写了一个函数,大家也可以直接放在下面,但是不推荐这么做
//在这里做了一个检测,当request抓取到error时,会传进回调函数的第一个参数,而第二个参数是返回报文
//第三个就是返回的信息了。200是正常处理的状态,所以进行一个显示操作
function callback(error, response, body) {
    if (!error && response.statusCode == 200) {
        var info = JSON.parse(body);
        console.log("info:", info);
    }
}

//这里也要注意,post需要这么写,使用get时,直接写request(options, callback);
request.post(options, callback);

当然,那是给http服务器发送报文,tcp发送报文的方法在net模块中有,万分简单,不再赘言


签到相关的模块补充

登录相关的模块在自作者的别的一篇小说中系统的讲过了
点击那里查看
这边做三个细小的填补,就是本身动用的加密模块bcrypt-nodejs
咱俩一般在数据库保存的是密文密码,不是公开场所密码,密码学是三个特地的知识,有趣味的能够深深参考一下,这里本身只说用法

var bcrypt = require('bcrypt-nodejs');
var password = user.password;//用户传入的明文密码
var hash = bcrypt.hashSync(password);//保存这个就行了

闭包

node本来就是js,说到js就得说说闭包呀,其实什么是闭包这几个标题也是比较难知晓的
阮一峰的互连网日志中有这么3个分解

闭包就是可以读取其他函数内部变量的函数。

那就是说,为啥要闭包?
我们不容许把变量都设置为全局变量,在函数中的变量,大家也有取出来的须求,在java的类中,有get方法能够一向拿到,而小编辈闭包所做的,也就恍如于那几个了。

//Java
public class init(){
     private String username;    
}

public String getUsername() {
   return username;
 }

//js
function init() {
  var name = "Mozilla"; 
  function displayName() { 
    alert(name);  
  }
  displayName();    
}

变更唯一的短Id

部分时候,做唯一性标识,而且不期待太长的时候,那是个很便宜的模块

本身要好生成的短Id

世家可以统计,你的数据量有多大时,会油但是生重复

var shortid = require('shortid');
var appId = shortid.generate();

再有为数不少用法机关google


函数种类化

函数自带toString方法,可以把函数转成字符串

function a() { 
  console.log("aaaa")
};
a.toString(); // => "function a(){console.log("aaaa")}"

近年干活中积淀了好多模块的运用方法,特此备忘啦,哇咔咔

TCP服务器

TCP服务器必要运用net模块,建立TCP服务器的场地依旧广大的,很多硬件发送帧都亟待TCP服务器来接收,学会那么些照旧很实用,作者用的不二法门也不多,大致为:

  • 创办服务器: createServer
  • socket连接建立
  • socket处理
  • socket连接关闭

平素上代码

var net = require('net');

//这里需要注意,直接写回环地址,比如localhost,或者127.0.0.1,就只会监听本机发来的连接,
//写成0.0.0.0 就可以处理发送到本机的所有连接了
var HOST = '0.0.0.0';
var PORT = 3030;

//创建tcp服务器,注意末尾需要把host和port加上,表示监听本机3030端口
net.createServer(function(sock) {

    // 输出我们获得的连接
    console.log('CONNECTED: ' +
        sock.remoteAddress + ':' + sock.remotePort);

    // 这是socket实例数据处理的一个事件,收到的数据会进入这里,然后交给回调函数的第一个参数
    sock.on('data', function(data) {
        //你可以在这里处理这个数据,做点什么事吧
    });

    // 这是socket实例关闭连接的一个事件
    sock.on('close', function(data) {
        console.log('CLOSED: ' +
            sock.remoteAddress + ' ' + sock.remotePort);
    });

}).listen(PORT, HOST);//不要忘记这里

//加个信息提示一下
console.log('Server listening on ' + HOST +':'+ PORT);

HTTP服务就背着了,做网站的开不了HTTP服务器,如故先去探望框架吧


一些有关时间处理的函数

本次也是大大刷新了作者对时间函数的用法,js提供的date对象,真是太好用了,不须求其余的模块,已经丰盛强劲了
看api手册就能博得多数新闻,日常用chrome的控制台也能补全函数,不怕忘记,说多少个这一次遇到的标题

  1. 时区对齐
    服务器直接拿走客户端的流年对象,只怕会产出在原来基础上助长8钟头的题材,这么些状态出现的来头是,大家国家统一行使新加坡无处时区的时辰,而作者国幅员辽阔,横阔多少个时区,幸免时区带来的杂乱,所以有了那8钟头的误差,可是大家在开发中,很多时候也是接纳日本首都时间,所以就得化解8钟头误差带来的熏陶

date.setHours(date.getHours() + date.getTimezoneOffset() / 60);//这样来消除
  1. 拿到当前礼拜是一年中的第多少个礼拜
    一年中的星期数是少数的,对她们一一编号,在做时间接纳的时候,是尤其有利于的,方法也万分简单

function getWeek(date, callback) {
    var time,week,checkDate = new Date(date);
    checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
    time = checkDate.getTime();
    checkDate.setMonth(0);
    checkDate.setDate(1);
    week=Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
    callback(week);
}

3.关于时间采取器
世家应该都驾驭datetimepicker,大家得以经过那个选项五个时间点,来得到那多个时间点之间的数码,不过此地必要专注一点,大家在岁月采纳器上采用了年月日式样的七个时间点,比如二〇一四年十月十日到二〇一四年3月十日,大家想取得的是1号,2号和3号的数据,不过时间采用器的平息时间是贰零壹陆年12月九日00:00:00,那样就只可以取得1号和2号的数目了,所以须求将时刻拨快一天,那里就用到setDate那一个艺术

date.setDate(date.getDate() + 1);

异步编程

讲真,node自带并发太折磨人了,写三个for循环,竟然各种循环体都以同步举行的,一旦有数据相关,for循环都无法用,一般方法是写回调,不过回调太多就成了大括号陷阱了,所以如故要依靠模块来协理,所以,作者当下是使用三种艺术化解异步编程

  • 数码少写回调
  • 多少多用async

一言以蔽之说一下async小编用的用法

var async = require('async');
var taskList = [task_1, task_2, task_3];
async.eachSeries(taskList, function(item, callback_async) {
        //item里面有taskList的值,用它可以来取值
       //做点什么吧,接下来的回调会进入下一个任务
      callback_async(null, item);
    }, function(err) {
        //错误处理
        console.log(err);
        if(err) {
            callback({ success: false, errorMessage: err});
        } else {
            callback({ success: true});
        }
});

有的时候会意识async也正如麻烦,那么推荐其余一个库co
co合作yield(es6),能够直达异步的目的

const co = require('co');

function* task_1() {
  // 你的函数
}

function* task_2() {
  // 你的函数
}

function* task_3() {
  // 你的函数
}

co(function *() {
  yield task_1;
  yield task_2;
  yield task_3;
}).then().catch();

Buffer处理

Buffer处理也是自家跟硬件打交道必要精通的,硬件一般走tcp来传输数据,传输到的数额貌似皆以流式数据
这一次工作自个儿第一接触的是16进制的buffer,所以自身几乎用到的措施:

  • buffer转json
  • json转字符串

这一次拍卖也是相比较窝火,比较硬件给的buffer不是那么听话,所以先用JSON.stringify()来归并格式,然后转成字符串数组,可是如此做出了三个新题材,转出来的是10进制的,而本人需求多16进制的字符串举行辨析,所以,就多1个10进制转16进制的步子,代码如下

var dataPromise_1 = JSON.stringify(data);
var dataPromise_2 = JSON.parse(dataPromise_1);
var array = dataPromise_2.data;
var str = '';
for(var num = 0; num < array.length; num++) {
     //这里因为10进制中,01变成了1,为了还原,所以有了这个步骤
     if(array[num] < 16) {
          str += '0' + array[num].toString(16);
      } else {
          str +=  array[num].toString(16);
      }
}

或是有人说,为何不用toString(),硬件传过来的buffer编码布吉岛形式啊,心里苦,只可以傻傻的这么暴力化解了


文件上传

由于自个儿使用的是express,官方推荐的中间件就是multer,这么些事物确实不易,你不要那几个,直接在req里是取不到文件的
应用它,有多少个点要注意

  1. form表单必须有enctype=”multipart/form-data” ,而且付出格局为post
  2. 多文本上传,input必须带上multiple=”multiple”,否则专断认同只好传壹个文件
  3. 后台对于单文件和多文本的处理是区其他,单文件的门道保存在file里,多文件保留在files里

var multer = require('multer');

var appStorage = multer.diskStorage({
    destination: function(req, file, callback) {
        //存放的位置
        callback(null, 'public/images');
    },
    filename: function(req, file, callback) {
        var appId = req.params.appId;
        console.log('appId', appId);
        var fileFormat = (file.originalname).split(".");
        //这一步会将存放的文件重命名成你想要的名称
        callback(null, file.fieldname + '-' + appId + '.' + fileFormat[fileFormat.length - 1]);
    }
});

//单文件使用single,里面的参数必须和input里的name一致
var startUpload = multer({ storage: appStorage}).single('startImages');

//多文件使用array,里面的参数必须和input里的name一致
var carouselUpload = multer({ storage: appStorageArray}).array('carouselImages');

//单文件处理
startUpload(req, res, function (error) {
        if (error) {
            //错误处理
        } else {
           //注意是file
            console.log(req.file.path);
        }
});

//多文件处理
carouselUpload(req, res, function (error) {
        if (error) {
            //错误处理
        } else {
           //注意是files,这里保存的是一个数组
            console.log(req.files[0].path);
        }
});


proto) 属性

该属质量够拿走或设置三个目标的原型

  1. 开创1个以指定对象为原型的目的

var obj = {
    __proto__: myProto,
    foo: 123,
    bar: "abc"
};
  1. 为停放类型添加子类型

var MyArrayProto = Object.create(Array.prototype);
//还可以写成var MyArrayProto = {__proto__:Array.prototype};
MyArrayProto.foo = function (...) { ... };
function createMyArray() {
    var arr = Array.prototype.slice.call(arguments);
    arr.__proto__ = MyArrayProto;
    return arr;   
}
var myarr = createMyArray(1,2,3);    //myarr会有foo方法,也会有其他的数组方法

获取url的参数

笔者未来貌似接纳三种艺术来在url里添加参数,所以,后台获取参数也会有所不相同

  1. 在url加入json字符串
    那应当是很广泛的法门,前端js可以在伸手的url里拉长json字符串,格式还足以友善定义,只要上下端保持一致就行,node在后台的剖析也很便宜,不用本人写正则表达式了

var url = require('url');
var token = (url.parse(req.url, true).query.token;//假设我传入的参数名是token
  1. 路由参数
    选择过express的童鞋应该领悟这些,在参数相比较少的状态下,这几个东西也是很好用的,它不必要相当的模块来分析

var express = require('express');
var router = express.Router();
//路径后面加上:,再跟上的就是参数名
router.get('/index/:id', function(req, res, next) {
   //参数名保持一致,就能从params里取到参数的值了
  var id = req.params.id;
});

原型

说到原型照旧得把Java拿出来做相比较,Java的类继承模型格外典型,而Js的则是饱受非议的原型继承
Java的类继承不是任重(英文名:rèn zhòng)而道远,可是要精通原型最好如故参考一下Java,有差异才有比较
对此Js,作者要么习惯使用栗子,在Js的array对象中,是尚未最大值,最小值的不二法门的,大家可以透过原型来不难我们的代码

Array.prototype.max =
function(){ 
  return Math.max.apply({},this) 
} 

Array.prototype.min = function(){ 
  return Math.min.apply({},this) 
} 

[1,2,3].max()// => 3 
[1,2,3].min()// => 1

这么数组就一贯可以取最大值最小值了,这样也就是重写原型中的方法(虽然原本从不)

原型的用法还广大,大家看看哪些把js的目的做的和java的大半
方法一:

var init = function(username) {
    this.username = username;
};

init.prototype = {
  getName: function() {
      return this.username;
  },

  setName: function(username) {
      this.username = username;
  }
};

var test = new init();
init.setName("fghpdf");
init.getName(); // => "fghpdf"

方法二:

var init = function(username) {
    this.username = username;
};

init.prototype = {
  getName = function() {
      return this.username;
  },

  setName = function(username) {
      this.username = username;
  },
  return {
       getName: getName,
       setName: setName
  }
};

var test = new init();
init.setName("fghpdf");
init.getName(); // => "fghpdf"

相关文章

网站地图xml地图