单元测试和Mocha
单元测试的必要性比如创建 add.js:
12345//add.jsfunction add(a,b){ return a+b;}
上面这个代码有啥好测得?
1234> add = function(a, b){return a + b}[Function: add]> add(4)NaN
NaN?为什么呢。因为不够严谨,只传一个参数就报错了。所以正确写法应该是这样的:
12345678910111213//add2.jsfunction add(a, b){ if (typeof a === "number" && typeof b === "number") { return a + b; } else { return undefined; }}
人在写代码的时候会有思维漏洞,但是在写测试的时候往往会考虑各种情况。这就是所谓的TDD。
Mocha测试框 ...
深入浅出node.js之网络编程
好久没更博客了,最近没看书了,买了辆公路车沉迷骑行无法自拔 -.-
node.js网络模块 node.js提供提供了 net 、 dgram 、 http 、https这四个模块,分别用于处理TCP 、 UDP 、 HTTP 、 HTTPS适用于服务器端和客户端。
构建TCP服务 TCP全名为传输控制协议,在OSI模型中属于传输层协议,许多应用层协议如HTTP、SMTP、IMAP等都是基于TCP构建的。
TCP是面向连接的协议,其显著特征是在传输前需要三次握手形成会话。
只有在会话形成之后,服务器端和客户端之间才能互相发送数据。在创建会话的过程中,服务器端和客户端分别提供一个套接字,这两个套接字共同形成一个连接。服务器端和客户端通过套接字实现两者之间的连接操作。
了解原理之后,通过node.js来创建一个TCP服务器端来接受网络请求。代码如下:
1234567891011121314151617var net = require('net');var server = net.createServer(function (socket){ socket.o ...
nginx+node.js实现简单的URL分发
前段时间做了一个主页部署到了vps上面,当时遇到一个问题没有解决:关于URL分发的问题。刚好我重装了一个vps,之前那个太贵了,装了一个低配一点的,然后我的主站就要重新部署。
之前是node监听的是一个非80端口,但是,阿里云默认解析到80端口,为了好看不再域名后面加:和端口号,我就只能把主站的监听端口改成了80,但是80只有一个,后面部署其他项目怎么办呢。。
于是我这次准备一次解决完:
第一个解决方法,好像去域名解析哪里设置什么显/隐性URL解析可以解决,因为阿里云要求解析域名和被指向域名都需要备案才行,不是实名认证,是备案哦。。别的服务商我不清楚,于是pass掉了。。
第二个方法:使用nginx配置来进行URL的分发。说实话搞完之后发现挺简单的,虽然nginx的具体配置意思不懂,但是先实现目的就行啦。。
安装nginx安装nginx
1yum install nginx
如果你不能通过上述命令安装,那么更换你的云源,或者参考linux部署网站一文中的node.js安装方式(我们不做伸手党!)
启动nginx
1systemctl start nginx
启动之后访问你解析后的域 ...
关于js的几种路径写法
Node.js中的文件路径大概有 __dirname, __filename, process.cwd(), ./ 或者 ../,前三个都是绝对路径。关于这几个路径的意思:
1234__dirname: 获得当前执行文件所在目录的完整目录名__filename: 获得当前执行文件的带有完整绝对路径的文件名process.cwd():获得当前执行node命令时候的文件夹目录名 ./: 文件所在目录
我在桌面的一个新建文件夹里新建了如下目录:
12345新建文件夹/ -dir -dir1 -path.js -dir2
path.js里有如下代码:
1234567const path = require('path')console.log('__dirname:', __dirname)console.log('__filename:', __filename)console.log('process.cwd():', process.cwd())console.log(& ...
Koa入门(一)
koa的安装安装
12npm init npm install koa
第一个hello world1234567891011var Koa = require('koa');var app = new Koa();app.use(ctx => { console.log(ctx.request,ctx.response); ctx.body = 'hello world!';})app.listen(3000);console.log('server is listen on 3000');
控制台结果:
12λ node koatest2.jsserver is listen on 3000
浏览器输入127.0.0.1:3000:
1hello world!
ps: var Koa = require('koa'); 如果K是大写就是koa2,小写就是koa,详细差异自己百度啦。
Koa中间件的级联洋葱模型:
比如下面这段代码:
1234567891011121 ...
npm install
npm的几种install的区别1234567npm install moduleName # 安装模块到项目目录下npm install -g moduleName # -g 的意思是将模块安装到全局,具体安装到磁盘哪个位置,要看 npm config prefix 的位置。npm install -save moduleName # -save 的意思是将模块安装到项目目录下,并在package文件的dependencies节点写入依赖。npm install -save-dev moduleName # -save-dev 的意思是将模块安装到项目目录下,并在package文件的devDependencies节点写入依赖。
那么问题来了,在项目中我们应该使用四个命令中的哪个呢?这个就要视情况而定了。下面对这四个命令进行对比,看完后你就不再这么问了。
npm install moduleName 命令
安装模块到项目node_modules目录下。
不会将模块依赖写入devDependencies或dependencies 节点。
运行 npm install 初始化项目时不会下载 ...
linux常用命令记录
平常常用的linux命令,持续更新。。主要是centos6/7,有差异。查看系统版本
123cat /etc/redhat-releasecat /proc/versioncat /etc/issue
查看64位还是32位
12getconf LONG_BITfile /bin/ls
查看相关进程状态(node)
1ps -ef | grep node
查询端口
1netstat -tulpn
根据端口号得到其占用的进程的详细信息
1netstat -tlnp|grep 80
一次性的清除占用80端口的程序
1lsof -i :80|grep -v "PID"|awk '{print "kill -9",$2}'|sh
手工终止进程的运行
1kill -9 PID
开启端口
1firewall-cmd --zone=public --add-port=80/tcp --permanent
防火墙设置 centos 7
12345systemctl start firewalld 开启防火墙systemc ...
关于Buffer
Buffer结构模块结构1.一个很像Array的对象。
2.Buffer是典型的js和c++结合的模块,性能部分由c++实现,非性能相关由js实现。
3.Buffer所占用的内存不是V8分配的,属于堆外内存。并且在nodejs启动时加载,并放在global上,无需require()就可以直接使用
Buffer对象Buffer对象类似于数组,元素为16进制的两位数,即十进制的0~255。
1234var str = "深入浅出node.js";var buf = new Buffer(str,'utf-8');console.log(buf);//=> <Buffer e6 b7 b1 e5 85 a5 e6 b5 85 e5 87 ba 6e 6f 64 65 2e 6a 73>
中文字utf-8下站三个元素,字母和半角标点符号站一个元素。Buffer可以通过length来获取长度
123var buf = new Buffer(100);console.log(buf.length);// => 100
以上代码初始化了 ...
linux部署网站
安装nodejs这个是真的难安,装了卸,卸了装。。。orz
1.cd /usr/local/src #定位到这个目录,下载的文件会在这个目录,版本号随着下载包的改变,最简单就是官网的linux安装包下载路径复制过来。不要问我为什么是user/local/src路径,因为别的路径环境变量配置不出来,搞了一下午。
1wget https://nodejs.org/dist/v6.9.4/node-v6.9.4-linux-x64.tar.gz
2.解压文件,版本号同理,就是刚下的安装包。
1tar xvf node-v6.9.4-linux-x64.tar.gz
3.移动,别问我为什么,实验出真理。
1mv node-v6.9.4-linux-x64 /usr/local/node
4.重点:NODE环境配置
1234567vi /etc/profile#在最下面加入#node config export NODE_HOME=/usr/local/nodeexport PATH=$PATH:$NODE_HOME/bin export NODE_PATH=$NODE_HOME/lib/no ...
V8的垃圾回收机制和内存限制
内存限制在一般的后端开发语言,在基本的内存使用上是没有限制的。
主要是因为 Node 基于 V8构建,所以在 Node 中使用的 JavaScript 对象基本是通过 V8 自己的方式来分配和管理的。
V8 的内存管理机制在浏览器上使用是完全足够的,但是对服务端来讲,限制了开发者随心所欲使用内存的想法。
尽管我们很少的场景会使用到很大的内存,比如大文件的读取我们都可以通过 Stream 来完成,但 Node 还是提供了方法打开这个限制。
默认内存大小
64位系统下,约为 1.4 GB
32位系统下,约为 0.7 GB
查询内存信息
1234567891011import { memoryUsage } from 'process'console.log(memoryUsage())// 打印:// {// rss: 4935680,// heapTotal: 1826816,// heapUsed: 650472,// external: 49879,// arrayBuffers: 9386// }
he ...