完美

[学习|工作|博客|交流平台|完美起航]

作者头像SmartZ2017.07.05 15:55 

node v6.9.2下使用async/await的方法

使用babel,配置.babelrc{ "presets":[ ["env",{ "targets":{ "node":true } }] ] }相关依赖package.json{ "name":"xxxx", "version":"1.0.0", "description":"xxxx", "main":"./public/index.js", "scripts":{ "test":"node./public/index.js" }, "keywords":[ "xxxx" ], "author":"xxx", "license":"ISC", "devDependencies":{ "babel-cli":"^6.24.1", "babel-plugin-transform-async-to-generator":"^6.24.1", "babel-plugin-transform-runtime":"^6.15.0", "babel-polyfill":"^6.23.0", "eslint":"^4.0.0", "eslint-config-google":"^0.8.0", "eslint-plugin-react":"^7.1.0" }, "dependencies":{ "babel":"^6.23.0", "babel-core":"^6.18.2", "babel-preset-env":"^1.6.0", "babel-preset-es2015":"^6.18.0", "babel-preset-stage-3":"^6.17.0", "babel-register":"^6.24.1", "babel-runtime":"^6.18.0", "bluebird":"^3.4.6", } }配置index.jsrequire('babel-register'); require('./app.js');app.js为项目主运行文件node ./public

Node 5684 4

作者头像zyw4932017.06.20 09:23 

NodeJs之co yield的使用,将异步转同步

例如:fs.writeFile是异步方法functiontest(){ returnco(function*(){ yield(()=>newPromise((resolve,reject)=>{ fs.writeFile(path,'',(err)=>{ if(err)returnreject(err); resolve(1); }); }))(); return; }); }调用test;co(function*(){ letres=yieldtest(); console.log(res); })

CO 3228 2

作者头像zyw4932017.06.19 10:34 

Git 的安装与权限的控制 (使用Gitolite)

一: Git的安装(centos) (参考 http://www.ccvita.com/tag/git/)注意:A: Git 没有什么server端和client端之分,Git属于分布式版本控制系统.B: Git 安装步骤yuminstallcurlcurl-develzlib-developenssl-develperlcpioexpat-develgettext-devel wgethttps://www.kernel.org/pub/software/scm/git/git-2.6.2.tar.gz autoconf ./configure make makeinstall二: 使用Gitolite来控制Git的权限 (参考 http://blog.it985.com/12344.html)我使用三台机器来验证gitolite对git权限的控制1: 192.168.1.250 centos (下文用"250机器"称呼) #这个机器作为存放最终版代码,也就所有项目的代码都会提交到这个机器.2: 192.168.1.25 ubuntu (下文用"25机器"称呼) #这个机器是运维工作人员的机器. 需要对192.168.1.250这台机器上的所有版本库进行权限的控制与用户的添加.3: 192.168.1.88 windows (下文用"88机器"称呼) #这个机器是普通开发人员的机器,权限被限制.A: 在250机器上创建一个用户(如git)这个用户不用设置密码,也就是不能远程登录(设置密码了也没关系因为安装好gitolite以后git用户就无法登录了). git用户的作用: 1:使用git用户安装gitolite以后.在git用户的家目录会自动生成一个 repositories目录,里面默认有两个项目目录(gitolite-admin.git 和 testing.git). 2: 开发者通过 git clone git@192.168.1.250:testing.git 来获取代码. 命令结构 (git clone 用户@ipdizhi:项目目录 ) 添加用户就不多说了.很简单 useradd git 就可以了...B: 在25机器上生成SSH Key , ubuntu系统生成SSHKey 也很简单和centos一样 只需要执行下面的命令 ssh-keygen -t sra -C "邮箱地址" #下面会提示输入密码,可以不用输入直接回车三次就会生成,生成的位置在当前用户的家目录下面的.ssh隐藏目录里面 ls /home/ricky/.ssh #ricky就是我使用的ubuntu系统的用户名 id_rsa id_rsa.pub 然后复制id_rsa.pub (公钥)到250机器的/tmp目录下面. 使用scp命令 scp /home/ricky/.ssh/id_rsa.pub root@192.168.1.250:/tmp/ricky.pub #拷贝id_rsa.pub到250机器并重命名为ricky.pub (如果是你的名字是zhangsan就换成zhangsan.pub)这个用户名设置权限的时候会用到的.C: 在88机器上SSH Key windows上安装好windows版本的git以后,可

git 806 4

作者头像SmartZ2017.06.09 18:46 

文件上传的两种方式

form上传文件2种方式2015-07-11 15:05 by ddxueyu,6482阅读,1评论,收藏,编辑示例1:表单里有图片/文件的上传<formenctype="multipart/form-data"method="post"><inputtype="file"name="uploadfile"/></form>multipart/form-data是上传二进制数据form里面的input的值以2进制的方式传过去,所以这里要明白,使用这种格式以后,后台request就获取不到数据了。enctype属性是设置提交数据的格式,指定将数据回发到服务器时浏览器使用的编码类型。enctype值:application/x-www-form-urlencoded:窗体数据被编码为名称/值对。这是标准(默认)的编码格式。multipart/form-data:窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。text/plain:窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符示例2:jquery ajax无刷新上传图片<formid='myupload'action='XXXXXXXXXXXX'method='post'enctype='multipart/form-data'> <divclass="demo"> <divclass="btn"> <span>添加附件</span> <inputid="fileupload"type="file"name="file1"> </div> <divclass="progress"> <spanclass="bar"></span> <spanclass="percent">0%</span> </div> <!--显示已上传的文件名--> <divclass="files"></div> <!--显示已上传的图片--> <divclass="showimg"></div> </div> <inputtype="submit"onclick="gosubmit2()"/> </form> <scripttype="text/javascript"src="jquery-form.js"></script> <scripttype="text/javascript"> varbar=$('.bar');//进度条 varpercent=$('.percent');

Jquery 7844 0

作者头像SmartZ2017.06.09 18:43 

JavaScript操作Cookie

设置cookiedocument.cookie="name="+username;JS读取cookie:varusername=document.cookie.split(";")[0].split("=")[1]; //JS操作cookies方法! //写cookies functionsetCookie(name,value) { varDays=30; varexp=newDate(); exp.setTime(exp.getTime()+Days*24*60*60*1000); document.cookie=name+"="+escape(value)+";expires="+exp.toGMTString(); }读取cookiesfunctiongetCookie(name) { vararr,reg=newRegExp("(^|)"+name+"=([^;]*)(;|$)"); if(arr=document.cookie.match(reg)) returnunescape(arr[2]); else returnnull; }删除cookiesfunctiondelCookie(name) { varexp=newDate(); exp.setTime(exp.getTime()-1); varcval=getCookie(name); if(cval!=null) document.cookie=name+"="+cval+";expires="+exp.toGMTString(); }//使用示例 setCookie("name","hayden"); alert(getCookie("name")); //如果需要设定自定义过期时间 //那么把上面的setCookie 函数换成下面两个函数就ok; //程序代码 functionsetCookie(name,value,time) { varstrsec=getsec(time); varexp=newDate(); exp.setTime(exp.getTime()+strsec*1); document.cookie=name+"="+escape(value)+";expires="+exp.toGMTString(); } functiongetsec(str) { alert(str); varstr1=str.substring(1,str.length)*1; varstr2=str.substring(0,1); if(str2=="s") { returnstr1*1000; }elseif(str2=="h"){ returnstr1*60*60*1000; }elseif(str2=="d"){ returnstr1*24*60*60*1000; } } //这是有设定过期时间的使用示例: //s20是代表20秒 //h是指小时,如12小时则是:h12 //d是天数,30天则:d30 setCoo

JS 7970 1

作者头像SmartZ2017.06.09 18:36 

NodeJs创建Web服务

用法node[options][v8options][script.js|-e"script"][arguments]请看命令行选项文档获取nodejs不同选项的信息和脚本运行方法。例子一个使用nodejs编写的web服务,输出'hello world':consthttp=require('http'); consthostname='127.0.0.1'; constport=3000; constserver=http.createServer((req,res)=>{ res.statusCode=200; res.setHeader('Content-Type','text/plain'); res.end('HelloWorld\n'); }); server.listen(port,hostname,()=>{ console.log(`Serverrunningathttp://${hostname}:${port}/`); });运行服务,保存上面的代码到example.js并且使用nodejs执行:$nodeexample.js Serverrunningathttp://127.0.0.1:3000/其他nodejs服务的执行与此相似。

Node 42211 7

作者头像SmartZ2017.06.09 18:29 

NodeJs的服务管理之PM2

一、简介pm2是一个带有负载均衡功能的应用进程管理器,类似有Supervisor,forever。二、安装Linux Binaries下载地址:https://nodejs.org/distcdoneinstack/src wgethttps://nodejs.org/dist/v4.2.4/node-v4.2.4-linux-x64.tar.gz tarxzfnode-v4.2.4-linux-x64.tar.gz cpnode-v4.2.4-linux-x64/bin/node/usr/local/bin/ cp-Rnode-v4.2.4-linux-x64/lib/node_modules/usr/local/lib/ ln-s/usr/local/lib/node_modules/npm/bin/npm-cli.js/usr/local/bin/npm npminstallpm2@latest-g#安装最新版本pm2模块PS: 如果你的主机无法连接公网,先找到能连公网的主机安装上面的方法安装pm2,然后拷贝到你要安装的主机。拷贝如下目录:/usr/local/bin/node /usr/local/lib/node_modules再创建相关软连接三、PM2常用命令假设你现在已经写好了一个app.js的文件,需要启动,你可以使用pm2进行管理1. 启动#pm2startapp.js #pm2startapp.js--namemy-api#my-api为PM2进程名称 #pm2startapp.js-i0#根据CPU核数启动进程个数 #pm2startapp.js--watch#实时监控app.js的方式启动,当app.js文件有变动时,pm2会自动reload2. 查看进程#pm2list #pm2show0或者#pm2info0#查看进程详细信息,0为PM2进程id3. 监控#pm2monit4. 停止#pm2stopall#停止PM2列表中所有的进程 #pm2stop0#停止PM2列表中进程为0的进程5. 重载#pm2reloadall#重载PM2列表中所有的进程 #pm2reload0#重载PM2列表中进程为0的进程6. 重启#pm2restartall#重启PM2列表中所有的进程 #pm2restart0#重启PM2列表中进程为0的进程7. 删除PM2进程#pm2delete0#删除PM2列表中进程为0的进程 #pm2deleteall#删除PM2列表中所有的进程8. 日志操作#pm2logs[--raw]#Displayallprocesseslogsinstreaming #pm2flush#Emptyalllogfile #pm2reloadLogs#Reloadalllogs9. 升级PM2#npminstallpm2@lastest-g#安装最新的PM2版本 #pm2updatePM2#升级pm210. 更多命令参数请查看帮助#pm2--help四、PM2目录结构默认的目录是:当前用于的家目录下的.pm2目录(此目录可以自定义,请参考:五、自定义启动文件),详细信息如下:$HOME/.pm2#willcontainallPM2relatedfiles $HOME/.pm2/logs#willcontainallapplicationslogs $HOME/.pm2

NodeJS 15632 3

作者头像congming2017.06.09 18:18 

JavaScript的面向对象编程之非构造函数的继承

这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现"继承"。今天是最后一个部分,介绍不使用构造函数实现"继承"。一、什么是"非构造函数"的继承?比如,现在有一个对象,叫做"中国人"。  varChinese={     nation:'中国'   };还有一个对象,叫做"医生"。  varDoctor={     career:'医生'   }请问怎样才能让"医生"去继承"中国人",也就是说,我怎样才能生成一个"中国医生"的对象?这里要注意,这两个对象都是普通对象,不是构造函数,无法使用构造函数方法实现"继承"。二、object()方法json格式的发明人Douglas Crockford,提出了一个object()函数,可以做到这一点。  functionobject(o){     functionF(){}     F.prototype=o;     returnnewF();   }这个object()函数,其实只做一件事,就是把子对象的prototype属性,指向父对象,从而使得子对象与父对象连在一起。使用的时候,第一步先在父对象的基础上,生成子对象:  varDoctor=object(Chinese);然后,再加上子对象本身的属性:  Doctor.career='医生';这时,子对象已经继承了父对象的属性了。  alert(Doctor.nation);//中国三、浅拷贝除了使用"prototype链"以外,还有另一种思路:把父对象的属性,全部拷贝给子对象,也能实现继承。下面这个函数,就是在做拷贝:  functionextendCopy(p){     varc={};     for(variinp){       c[i]=p[i];     }     c.uber=p;     returnc;   }使用的时候,这样写:  varDoctor=extendCopy(Chinese);   Doctor.career='医生';   alert(Doctor.nation);//中国但是,这样的拷贝有一个问题。那就是,如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。请看,现在给Chinese添加一个"出生地"属性,它的值是一个数组。  Chinese.birthPlaces=['北京','上海','香港'];通过extendCopy()函数,Doctor继承了Chinese。  varDoctor=extendCopy(Chinese);然后,我们为Doctor的"出生地"添加一个城市:  Doctor.birthPlaces.push('厦门');发生了什么事?Chinese的"出生地"也被改掉了!  alert(Doctor.birthPlaces);//北京,上海,香港,厦门   alert(Chines

JavaScript 3446 2

作者头像congming2017.06.09 18:14 

JavaScript面向对象编程之构造函数的继承

这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例。今天要介绍的是,对象之间的"继承"的五种方法。比如,现在有一个"动物"对象的构造函数。functionAnimal(){ this.species="动物"; }还有一个"猫"对象的构造函数。functionCat(name,color){ this.name=name; this.color=color; }怎样才能使"猫"继承"动物"呢?一、 构造函数绑定第一种方法也是最简单的方法,使用call或apply方法,将父对象的构造函数绑定在子对象上,即在子对象构造函数中加一行:functionCat(name,color){ Animal.apply(this,arguments); this.name=name; this.color=color; } varcat1=newCat("大毛","黄色"); alert(cat1.species);//动物二、 prototype模式第二种方法更常见,使用prototype属性。如果"猫"的prototype对象,指向一个Animal的实例,那么所有"猫"的实例,就能继承Animal了。Cat.prototype=newAnimal(); Cat.prototype.constructor=Cat; varcat1=newCat("大毛","黄色"); alert(cat1.species);//动物代码的第一行,我们将Cat的prototype对象指向一个Animal的实例。Cat.prototype=newAnimal();它相当于完全删除了prototype 对象原先的值,然后赋予一个新值。但是,第二行又是什么意思呢?Cat.prototype.constructor=Cat;原来,任何一个prototype对象都有一个constructor属性,指向它的构造函数。如果没有"Cat.prototype = new Animal();"这一行,Cat.prototype.constructor是指向Cat的;加了这一行以后,Cat.prototype.constructor指向Animal。 alert(Cat.prototype.constructor==Animal);//true更重要的是,每一个实例也有一个constructor属性,默认调用prototype对象的constructor属性。alert(cat1.constructor==Cat.prototype.constructor);//true因此,在运行"Cat.prototype = new Animal();"这一行之后,cat1.constructor也指向Animal!alert(cat1.constructor==Animal);//true这显然会导致继承链的紊乱(cat1明明是用构造函数Cat生成的),因此我们必须手动纠正,将Cat.prototype对象的constructor值改为Cat。这就是第二行的意思。这

JavaScript 3444 1

作者头像congming2017.06.09 17:47 

JavaScript的面相对象编程之封装

Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。那么,如果我们要把"属性"(property)和"方法"(method),封装成一个对象,甚至要从原型对象生成一个实例对象,我们应该怎么做呢?一、 生成实例对象的原始模式假定我们把猫看成一个对象,它有"名字"和"颜色"两个属性。varCat={     name:'',   color:'' }现在,我们需要根据这个原型对象的规格(schema),生成两个实例对象。varcat1={};//创建一个空对象 cat1.name="大毛";//按照原型对象的属性赋值 cat1.color="黄色"; varcat2={}; cat2.name="二毛"; cat2.color="黑色";这就是最简单的封装了,把两个属性封装在一个对象里面。但是,这样的写法有两个缺点,一是如果多生成几个实例,写起来就非常麻烦;二是实例与原型之间,没有任何办法,可以看出有什么联系。二、 原始模式的改进我们可以写一个函数,解决代码重复的问题。functionCat(name,color){ return{ name:name, color:color } }然后生成实例对象,就等于是在调用函数:varcat1=Cat("大毛","黄色"); varcat2=Cat("二毛","黑色");这种方法的问题依然是,cat1和cat2之间没有内在的联系,不能反映出它们是同一个原型对象的实例。三、 构造函数模式为了解决从原型对象生成实例的问题,Javascript提供了一个构造函数(Constructor)模式。所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量。对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上。比如,猫的原型对象现在可以这样写,functionCat(name,color){ this.name=name; this.color=color; }我们现在就可以生成实例对象了。varcat1=newCat("大毛","黄色"); varcat2=newCat("二毛","黑色"); alert(cat1.name);//大毛 alert(cat1.color);//黄色这时cat1和cat2会自动含有一个constructor属性,指向它们的构造函数。alert(cat1.constructor==Cat);//true alert(cat2.constructor==Cat);//trueJavascript还提供了一个instanceof运算符,验证原型对象与实例对象之间的关系。alert(cat1instanceofCat);//true alert(cat2instanceofCat);//true四、构造函数模式的问题构造函数方法很好用,但是存在

JavaScript 3245 1

a6bfb44cbd5549740eb36647f36ef83a