版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Node.js部分内容整理该文档用于node.js基本功能、安装步骤和环境配置的学习以及交流一、Node.js内容简介1、当前的服务器程序有什么问题?在Java和PHP这类语言中,每个连接都会生成一个新线程,每个新线程可能需要2MB的配套内存。在一个拥有8GBRAM的系统上,理论上最大的并发连接数量是4,000个用户。随着您的客户群的增长,如果希望您的Web应用程序支持更多用户,那么,您必须添加更多服务器。当然,这会增加服务器成本、流量成本和人工成本等成本。除这些成本上升外,还有一个潜在技术问题,即用户可能针对每个请求使用不同的服务器,因此,任何共享资源都必须在所有服务器之间共享。鉴于上述所有原因,整个Web应用程序架构(包括流量、处理器速度和内存速度)中的瓶颈是:服务器能够处理的并发连接的最大数量。也就是说,用户请求到来后,Java等语言会为其分配一个线程来处理,此时这个线程就只能处理该请求,并且需要一直维护该请求所需要的资源直到响应才会释放资源;如果并发量很大,就会造成后面的请求处于阻塞状态。2、NodeJS如何解决上述问题?NodeJS采用了不同的方式来处理请求。它每接收到一个请求就会触发一个事件,并且将该事件加入到事件队列中,紧接着又以同样的方式去处理下一个请求;这样能够保证每一个请求都被及时处理(“处理”:指被加入到事件队列的过程),不会阻塞后面的请求。同时NodeJS引擎会调度事件队列中的任务,执行这些任务,最后将结果响应给用户。即更改连接到服务器的方式,每个连接会触发一个事件,NodeJS引擎会把该事件放入到事件队列中,而不是为每个连接分配一个OS线程及其配套内存空间。(注意:维护事件队列本身也是需要成本的,而且事件队列越长,得到响应的事件就越长,并发量上去还是会力不从心。)3、Node.js使用了V8引擎V8引擎是Google用于其Chrome浏览器的底层JavaScript引擎,负责解释并执行JS代码,并且内置了一个用C++编写的超快解释器;最值得一提的是V8引擎可以被嵌入其他任何应用程序,并不仅限于在一个浏览器中运行。NodeJS的作者也正是看中这一点,将其作为NodeJS的核心引擎。:、Node.js下载、安装、环境搭建第一步、windows下的NodeJS下载(V0.6.0版本之后,支持windowsnative),只需要登陆Node.js中文官网(http:〃/),便可以看到:Node.js登陆Node.js中文官网(http:〃/),便可以看到:Node.js是一个基于ChromeV8引擎的JavaScript运行环境.Node.js使用了一个事件驱动、非阻塞式I/O的模型r使其轻量又高效。Node.js的包管理器印m,是全球最大的开源库生态系统,F载Windows(x64)第二步、安装。这里我们使用V4.2.4版本,安装比较简单直接点击install就可以安装了,更多下载I更新日志|由同文档更岁下载I更新日忑儿同文档稳定版本『品新特性V444畏朋支特版本,成蜴可靠V620安装过程基本直接“NEXT〃就可以了。(windows的安装msi文件在过程中会直接添加path的IMSTALLDCfi.VMLO*DSWDOCS系统变量,变量值是你的安装路径,例如“C:\ProgramFiles\nodejs〃)CurremrVprsion-vQJCi,11flppilcaiions.NoIMSTALLDCfi.VMLO*DSWDOCS系统变量,变量值是你的安装路径,例如“C:\ProgramFiles\nodejs〃)CurremrVprsion-vQJCi,11flppilcaiions.No。府Jwusesaneveiii-driven.ncn-biocklnqi/omodelinai ieiiqhTwtightefficient,perfeCTfordata-intensivereat-timeapplicatEonsthatrunacrossdistributeddevices.Nudmjsisap9aLformbuifitonForeasilybuilding后弓工scalcLblenetworfc第三步、测试。安装完成后可以使用cmd(win+r然后输入cmd进入)测试下是否安装成功。方法:在cmd下输入node-v,出现下图版本提示就是完成了NodeJS的安装。C:\WINDOWS\system32\CMD.exeMicrosoftWindows[版本10.0.143931(c)2016MicrosoftCorporation^保留所有权利。3:\Users\hp>node-vv4.2*4二:\Users\hp/_第四步、npm的安装。由于新版的NodeJS已经集成了npm,所以之前npm也一并安装好了。同样可以使用cmd命令行输入“npm-v”来测试是否成功安装。如下图,出现版本提示便OK了。SAC:\WIN 2\CMD.exe -IXMicrosoftWindows10.0.14393'(c)2016MicrosoftCorparatlono保留所有权利.C:\Lsers\hp>node-vv4.24C:\Useis\hp>npni-v12C;\Lsera\lip^.第五步。常规NodeJS的搭建到现在为止已经完成了,急不及待的话你可以在〃cmd,输入"node"进入node开发模式下,输入你的 NodeJS第一句:"helloworld"-输入:console.log('helloworld')。二 白>consoIe?.log(nhelloword1)。[卜11owordjndefined我们要先配置npm的全局模块的存放路径以及cache的路径,例如我希望将以上两个文件夹放在NodeJS的主目录下,便在NodeJs下建立"node_global"及"node_cache"两个文件夹。如下图名称node-_cachenode-_globalnode-_modules3node-.exe画node-_&tw_provider.man画node-_perfc±r_provider.man[^1nod&vars.bat回npm质Inpm.cmd例如Node.js的地址是C:\ProgramFiles\nodejs启动cmd则输入:npmconfigsetprefix"C:\ProgramFiles\nodejs\node_global"以及npmconfigsetcache"C:\ProgramFiles\nodejs\node_cache"当然这个可以不用配置第六步。模块的下载和安装。选择express这个模块。同样在cmd命令行里面,输入“npminstallexpress-g”(“-g”这个是全局安装的意思,也就是上面说设置的"C:\ProgramFiles\nodejs\node_global〃里面。)。待cmd里面的安装过程滚动完成后,会提示“express〃装在了哪、版本还有它的目录结构是怎样Inpm e£友(?工.0.EHorepositnryfleId«]npm mglify-js&2-2,5 repositoriesJ<plural>Notsupportednpin Pleasepickone asthe1repositoryJfieId|nppi css-parsePl HorepositoryField.|npni css-sti*in9if .0.5Ho胪epci窑工七ory£lbId»[expr-essOS.2.GCl%JPrngranFiLesSnadsjs^nads_glnbal\jiDde_mocl.uleE^expi-ess"—nethodsl?0.B.l fpeshUO.l.H r德nge—p在Ffe尸0R,耳+4 coakie—e^0^1 huf ,1 Eoakle(?0.1,0J debug(?0.?.2| connandeH?0.6,1第七步。模块的全局安装与本地安装。npm的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如npminstallexpress #本地安装npminstallexpress-g#全局安装第八步。环境变量设置,打开系统对话框,“我的电脑”右键“属性”-“高级系统设置”-“高级”-“环境变量”。如下图:控同向板主页区控同向板主页区设各管霞V疝程遢亘卞瑞褥持至温理性设置环境变量:变量名:NODE_PATH值:D:\ProgramFiles\nodejs\node_global\node_modules注意:因为我是把nodejs安装在D:\ProgramFiles\目录下,所以环境变量就这样设置的D:\ProgramFiles\nodejs\node_global\node_modules注:最新版nodejs安装版已经不需要进行环境变量设置了直接可以在运行里面使用node和npm命令第九步。模块卸载。我们可以使用以下命令来卸载Node.js模块。$npmuninstallexpress卸载后,你可以到/node_modules/目录下查看包是否还存在,或者使用以下命令查看:$npmls三、用Node.js构建的项目结构通常使用express-generator模块来快速创建一个应用骨架,然后再在此基础上做一些适
当的调整即可。用法:.全局安装express-generator.新建一个文件夹用于存放项目.在该文件夹下,执行如下命令:expressemyProject.成功执行后,可以在该文件夹下发现新生成了一个名为myProject的工程口口口口国嬴E-:S-H-;E-:…-…….~£}■myFrdjfietbinpublicroutesvi0*wa口口口口国嬴E-:S-H-;E-:…-…….~目录说明:bin--->存放NodeJS项目的启动脚本;public--->存放静态资源,如图片、css和js文件等;routes--->存放自定义路由;views--->存放模板文件,如ejs、jade;app.js--->该文件包含了一些express基本路由规则;package.json--->描述项目工程信息,如项目名称、版本、依赖模块等;这个结构不符合我们现在开发需要,所以需要调整一下:Ttelematicssys(F:\webPnqjec^)cachecontrollermodelutilbin►Dcert▼Dconfig.口envpassportprivilegetsessionStorejsIndexJsF亡]dist►口logs卜:node_modules(libraryh(▼口public口9口img口」弓口lessEllibroutestestviews目录说明:app/cache-->存放缓存方法;app/controller-->存放处理业务逻辑的文件;app/model-->存放实体类;app/util-->存放各种工具脚步;bin--->存放NodeJS项目的启动脚本;logs--->存放应用程序日志;config-->存放项目配置文件;public--->存放静态资源,如图片、css和js文件等;public/lib--->存放前端第三方插件;routes--->存放自定义路由;test--->存放测试用例;utils--->存放工具类,如日志工具类、日期工具类;views--->存放模板文件,如ejs、jade;app.js--->该文件包含了一些express基本路由规则;package.json--->描述项目工程信息,如项目名称、版本、依赖模块等;四、项目构建和部署1、Less文件要用使用gulp命令编译成css文件2、项目部署分为:手动部署和自动部署。・手动部署1、通过ssh登录服务器2、进入nodejs目录3、执行:gitpull命令拉取最新代码4、执行:npminstall安装新依赖5、执行:pm2restartall重新启动nodejs进程・自动部署使用Jenkins来实现自动部署。当新的代码被合并到仓库后,可以自动触发Jenkins编译,执行单元测试,然后将构建结果自动部署到应用服务器五、Node.js常用技术点、常用命令npmnpm是NodeJS的包管理器,通常我们在安装nodejs的时候都会自带该命令工具。主要用于安装或卸载第三方模块。安装到当前目录:npminstallMODULE_NAME-save或npminstallMODULE_NAME-save-dev全局安装:npminstallMODULE_NAME-gcnpm由于国内的网络环境不稳定,经常无法正常下载某些模块,因此淘宝建立了一个镜像,并定制了一个命令行工具cnpm用于开发人员下载资源。安装cnpm:npminstall-gcnpm--registry=使用cnpm:用法同npm命令。nodenode命令主要用于执行js文件。例如:nodeapp.js。更多用户可以通过输入node-help命令来查看。六、nodejs常用模块NodeJS中常用的模块主要有:http、body-parser、cookie-parser、path、util、fs、events、async、express、ejs、10g4js、mysql、eventproxy和gulp等。http要使用HTTP服务器或客户端功能,需引用此模块。常用APIs:http.createServer([requestListener]):创建并返回一个web服务器对象。server.listen(port,[hostname],[backlog],[callback]):监听指定端口,其中server为createServer()方法所创建的web服务器对象。http.request(options,callback):创建并返回一个httprequest请求实例。req.write(data):发送数据。其中req为httprequest请求实例。req.end():使用http.request(方法时都必须总是调用req.end()以表明这个请求已经完成,即使响应body里没有任何数据。示例:varhttp=require(fhttp1);□http.createServer(function(reqres}-{res-Gnd(1OK....OKr);A}).listen(3000,-function(){console.Log(rserveris-readyr)jvaroptions={host;'hiatu.r,port:80,path:'/uploadrrmethod;rPOSTrwarreq=http.request(optionsjfunction(res)-{console.l_og(rSTATUS:r十res.statusCode);conso-le.Log(rHEADERS:r+JSON.stringify(res.headers));res.setEncoding(rutf81);re5.on(rdatarrfunction(chunk){console.log(rBODY:r+chunk);}八1);req.write('data\n1);req.write('data\nr)jreq.end();API链接:http:〃/api/http.html#httprequestwritechunkencoding4837body-parser第三方模块,用于解析客户端发来的请求中body部分的内容,包括:JSON解析处理和URL编码处理。之前是express模块的一个中间件,现在分离出来成为了一个模块。实际应用中也还是与express配合使用。常用APIs:bodyParser.json():bodyParser.urlencoded(options):示例:ivarspp=expressOj\//vieu1wngincsetup:app.set(1views19path.join( dirname1uiewEi,))J\app-set('viewengine'2"ejs')juncommentafterplacingyour1faviconin/public/app*use(favicon(pathtjoin(dirname1publicpfawicon.;icop)));:app.us£'(logger(pdlev'));:app-U5e(bodyPar5er-j));:app.usq(bod>Parser.urlencoded({extended:false}));//extendedl=fa1 1rnp2arsercookie-parser第三方模块,用于获取web浏览器发送的cookie中的内容。它会解析header中的cookie,并将解析后的结果填充到req对象的cookies属性中。示例::tip已pp=express()5\」fviewenginesetupapp.se±(pviewsrfpa±h.join( dirnam^^1viewsr));app.se±(pviewenginer,*ej5r);uncommentafterplacingyourfaviconin/publicapp.use(favicon(path,jointdimame,1publicr,rfaviapp-use(logger(rdev,));app-use(bodyParser.json());app_use(bodyParser.urlencoded({extended:falsey))japp-use(cookieParser());path预置模块,用于处理目录,提高开发效率。常用APIs:path.normalize():将不符合规范的路径格式化,简化开发人员中处理各种复杂的路径判断。path.join(PATH1,PATH2,•米将所有名称用path.sep串联起来,并调用用normailze()方法格式化。其中path.sep指代的是特定于平台的文件路径分隔符。"某0的系统下的例子:'foo/bar/bar'_split(path.sep);//returns[rfoor,rbar*Jrbazr]//windows系统下的例子'f&o\\bar\\baz'.split(pai:h_sep);//returns[rf00',rbar(rbazr]utilutil是一个Node.js核心模块,提供常用函数的集合,用于弥补核心JavaScript
的功能过于精简的不足。常用APIs:>util.inherits(constructor,superConstructor):用于实现对象间原型继承。>util.isArray(obj):判断obj是否是数组类型。>util.isDate(obj):判断obj是否是Date类型。>util.isError(obj):判断obj是否是判断obj是否是Error类型示例:varutil=require(rutilr)■functionBase(){=rbaser■|Btotype.showName=function(){console.log()■functionSub(){=rsub'■|util.inherits(Sub,Base)■varobjSub=newSub()■objSub.showName()■//sub//util.isArrayutil.isArray([])j//truefsfilesystem是NodeJS的核心模块,用于对文件进行读写操作。示例:vanfs=require(rfsr)■fs.readFile('/trnp/hello1,function(erradata)-{if(err)throwenr;console_log(data);API链接:/api/fseventsevents模块提供了一个十分重要的对象events.EventEmitter。EventEmitter的核心是事件发射与事件监听器。EventEmitter支持若干个事件监听器。当事件发射时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。EventEmitter提供了几个简单但很重要的API:emitter.on(event_name,listener):为名称是event_name的事件注册一个监听器listener。其中emitter为EventEmitter的实例对象。emitter.emit(event_name,argl,arg2,…):触发名称为event_name的事件,并向该事件的监听器传递参数。emitter.removeListener(event_name,listener_name):从event_name事件上将listener_name监听器移除。大多情况不会直接用EventEmitter,而是在对象中继承。原因:首先,具有某个实体功能的对象实现事件符合语义,事件的监听和发射应该是一个对象的方法。其次JavaScript的对象机制是基于原型的,支持部分多重继承,继承EventEmitter不会打乱对象原有的继承关系。示例:varevents=require(reventsr),util=rsquire(rutilr);functionBase(){this.emitter=newevents.EventEmi±ter()j)utiL-inherits(E£iseJevents.EventEmitter1)■Btotype.onEvent=function(eventNamejlistener){this.emitter.on(eventNamejlistener);Btotype.■emitEvent=function(eventNamerargs){this.emitter.emit(eventNameargs);};module-exports=Base;8.async流程控制本来是件比较简单的事,但是由于Nodejs的异步架构的实现方法,对于需要同步的业务逻辑,实现起来就比较麻烦。嵌套3-4层,代码就会变得的支离破碎了!async就是用于解决流程控制问题的工具包。常用APIs:async.waterfall([func1,func2,…],callback):按顺序依次执行一组函数。每个函数产生的值,都将传给下一个。async.parallel([func1,func2,“J,callback):并行执行多个函数,每个函数都是立即执行,不需要等待其它函数先执行。传给最终callback的数组中的数据按照tasks中声明的顺序,而不是执行完成的顺序。API链接:/bsspirit/asyncdemo补充:在书写JS代码的时候,我们通常会遇到两种比较常见的场景:#1:各个操作之间是可以并行执行的,只是在最后一步里面需要把他们各自执行的结果整合。针对这种场景,我们可以使用eventproxy.all()或async.parallel()方法来解决。2:各个操作之间是需要串行执行并且后一步操作依赖前面操作的返回结果,但由于Node使用的是回调机制,导致程序无法串行执行。针对这种场景,有两个解决方法:2.1:回调函数嵌套functiondoSthO[getUserlnfoFrarnDB(param,function(rIjata){//getralelist,butneedrrData3firstgetR.o1eListFromDB(rData,ftinclion(rd1es){//daotherthings})」这种方式很容易形成回调地狱(callbackhell)。2.2:使用async模块的async.waterfall()fi-inctiondoSth(){async,waterfall([function(cb)[getUserlnfoFroinDB(param,functionfrData)[cb(null,rData);//格式与maineallb包ck保持一致})二),functionCdatajcb)(getRoleListFroinDB(data,function(rData)(cb(null,rData);));]jfLinetion(err,rData)(//maincallbackif(err)[throwerr;}"slse{console,logf0K;rData);)]);9.expressexpress是目前最流行的基于Node.js的Web开发框架,可以快速地搭建一个完整功能的网站。express中有两个概念比较重要:中间件和路由。路由将不同的请求分配给相应的处理函数的过程就叫做路由。示例:app.use(logger(Jdev));app.use(bodyParser.jsonO);app.use(bodyParser.urlencoded({extended:false}));app.use(cookieParser());app.use(express,static(path.join(_dirnairiE,'public')));app.use(Jfjfunction(reqjres,next)(//中间件1if(condition){/席满足条件res.sendCDK');}else[neit()将请求传递给下一个中间件)}nfi-inction(re^res3next){//中间件2res.sendCOK...J);“最后一个中间件不能再传递请求,必须要返回响应));上图中定义了一组路由规则,app代表应用服务器实例。app.use(pattern,handleri,handler2,…):个use():表示POST和GET请求都可以被接受,若只希望接受POST请求,则可直接使用app.post()方法;令pattern表示对URL的匹配;可以是一个表达式,例如:〃/test/*〃表示匹配所有URL路径请求中以test开头的请求,这种写法可以匹配无限级路径,但优先级最低;〃/test/:id〃表示只匹配URL路径以test开头且只有两级的请求;也可以省略不写,表示对于所有请求都直接调用处理函数handlder;。handler表示处理程序,即中间件;>中间件从概念上来讲,可以简单的看作是一段对httprequest进行处理的程序。只不过这个“处理程序”可以决定是“直接返回httpresponse”或是“将httprequest交给下一个中间件”。中间件最大的特点就是:一个中间件处理完,再传递给下一个中间件。常用APIs:express():创建并返回一个应用服务器实例。本质上是对http.createServer的封装。app.set(name,value):用于设置变量的值。示例:app.set('views,,__dirname+’/views"):设置模板文件所在目录。其中views用于指定模板文件所在的目录,res.render方法会需要到该目录中查找模板;—dirname表示当前项目所在路径。app.set(‘viewengine",‘ejs"):用于指定模板文件的后缀,这样就可以使得我们在调用res.render()方法时,第一个参数可以只传入文件名。app.get(name):获取设置的变量。示例:app.get('views"):获取模板文件所在目录。app.engine(suffix,handler):让模板引擎可以识别带有指定后缀的文件。示例:app.engine('.html’,require('ejs").renderFile)让ejs引擎可以识别.html文件,这样我们就可以直接在html文件里面使用ejs标签。express.static(path):指定静态资源存放的路径,如对于静态html页面、js、css.images这类资源的访问,应用服务器就可以直接响应。示例:app.use(express.static(_dirname+'/public")):配置一个静态路由,专门用于处理对静态资源的访问。ejsejs是一个开源的Node模板引擎,学习成本低。ejs主要有两种标签:><%code%>:用于书写JavaScript代码。示例:注意:示例中的title是从后端传递过来的(后端代码:res.render('index’,{title:‘test'})><%=code%>:打印JS变量到页面上。示例:(见上图)log4js用于日志记录。10g4js的输出级别有6个:trace,debug,info,warn,error,fatal。1ogger.trace();logger.debug();();logger.warn();logger.error();logger.fatal();示例:varLog4js=requiredlag4jsLogConfig=required.. ./config^).Iog4js;Log4js.configureQlogConfig.configure);lesports.logger=fumetion(name){varlogger=Log4js.getLogger(name);lesser.seILeveL(losConfig.level)」returnlogger;};配置信息:appenders:[(type:9consol上(type:file"□fi1ename:"logs/access.1ogJ,niaxLogSize:1024』backups:4,category:'norina1J)LreplaceConsole:truemomentmoment模块是一个简单易用的轻量级JavaScript日期处理类库,提供了日期格式化、日期解析等功能。它能够将给定的任意日期转换成多种不同的格式,具有强大的日期计算功能,同时也内置了能显示多样的日期形式的函数。示例:varmoment=require(Jmoinent');moment("20120620"」"YYYYN1WD").fromNowO;momentstartOf(Jday').fromblow();moiDEdOf(Jday").fr口icN□忡0;moiDEnt0・startOf「hour").fromN□阳0;官网链接:/mysqlmysql模块是一个纯nodejs的用javascript实现的一个MySQL客户端程序,封装了对mysql的基本操作。通常我们使用它来做这几件事情:建立数据库连接、表新删改查、事务处理、连接池配置。>建立数据库连接使用mysql.createConnection(db_config)方法来创建并返回一个数据库连接。其中,db_config代表数据库连接配置。示例:varirysql-requireCirysql"db_config=requireC.. ./configJ).db;functionKysqlDao(){this,conn=icysql.cresteConnectian(db_CQnfig);}JtysqlDtotype,escute=functionCsq!,param,cb){this.conn,connect();this.conn,querytsq],param,ch);}module,exports=MysqlDao;db_config配置信息:exports,db=[host:J1ocalhost"juser!」nodejs"」password:'yuan'」•database:JnodejsTest",,port:330o>表新删改查使用conn.query(sql,params,callback)方法来执行sql语句。其中,conn代表数据库连接实例,sql表示要执行的sql语句,params是sql语句中占位符所对应的参数值,callback为sql语句执行完毕后的回调函数。示例:?functionMysqlDaoO[this,conn=mysq.1.CTeateConnectiorL(db_config);rpNysqlDtotype,eicute=function(sqljparam;cb)[6this,e口nn.conn巴ct。;//苜先,建立连接」〃删除vardelete_sql='deletefromt_userwhereusername=?';[this.conn.Query(del■ete_sqlJ["Alice"],,function(err,ret)[cb(erfjret);));事务处理mysql模块支持connection级别的简单事务处理。conn.beginTransaction(callback):用于开启事务;mit(callback):用于提交事务;conn.rollback(callback):用于回滚事务;示例:?MysqlDtotype.eicuteWithTransaction=fun二ticin(sq_,param,cl:)(vaithiz=this;thiz,conn,connect0;,6tB车接Ethiz.conn,begitiTransac11on(fimct1on(err)[//开启事务if(err){:hr涧err;I vardelete_sql=deletefromt_userwhereusername=/;R thiz.conn,query(delete_sqlj[JAlice'functionfsErr,ret){/的彳丁sqlH {f(sErr){? thiw.ccmn.TdlLback(functidnO{//发生异常,执行回滚this.conn,end。;/7关闭是接throwsErr;3 ));R jelse(9 thiz.conn,cornmit(fundion(){//提交事务thi7.ronn.end。;cb(nullret);]});J11J);连接池创建及配置在实际项目中,通常使用连接池来管理数据库连接。mysql模块中使用mysql.createPool(pool_config)来创建并返回一个连接池实例,使用pool.getConnection(callback)向连接池申请一个连接。示例:varmysql=requiredrrysql'),pool_config=requireC.. ./configJ).dbPool;^functionMysqlDaoO{this,pool=mysql.createPool'-pool_config);r^NysqLDtotype,eicute=functionCsql;,paranrcb){pthis.pool.getConnection(function(err3(:口nn){//^取连接conn,query(sql,param,匚b)://执行mql」});连接池配置:leipDTts.d:F口口1={bast'lo匚"Ltuist'iiuseriwdejsJjpassword;"Yuan’,Jai吐3E:?DadtjsiT42tpBpart33DBr.scqiiirelinKUI15*1000,"连存超日|时长,草危i青甘”口己11:21<1(|正曰:11团51工|招3,诀定当钱!:&连特也或者陡卷翦打到最:大信时取出11的斤为第0U亡时才聊叁提放R四列中在可用是调用,力时舍至即返回亡期殖snrmtiariLLmit:10,八串示硅授池一次最冬创建多少打邦S1 补充:git链接:https:〃/felixge/node-mysq,另外推荐一个ORM模块-sequelizeeventproxyeventproxy模块是对events模块的封装,并且也增加了一些新的API,主要用于流程控制避免回调地狱问题。与async模块不同的是,eventproxy采用事件驱动的方式来编写代码。常用APIs:>eventproxy.create(events,handler,errHandler):创建并返回一个eventproxy实例。>ep.all(events,handler):当events事件被触发后,才会执行handler。其中ep表示eventproxy实例;events是事件名称的集合,可以是数组;handler是所有事件都被触发后才会执行的回调函数。>ep.on(event_name,handler):为事件添加一个监听器。>ep.emit(event_name,param):触发指定事件。>ep.after(event_name,times,handler):当指定事件被触发N次后,才执行handler。其中,times就代表被触发的次数。示例:functiondoSthO(varep-EveniProxy,create0;cp.sill(,[-gctUscrJ,'getGoods'】JgctGaodsType^]」fundion(uscr^goDdsjg口口 {//dosthhere...));db.get('user二function(ret){cp.emitCgctUser^Lt};//触发事件]);db.get(/goods7function(ret){ep.emit('"getGaods^ret);));db.get(^goodsType-"Jfunction(ret){ep.emitC*gctGaodsTypc^jret);官网链接:/eventproxy/api.htmlsupervisor通过supervisor启动的app应用,每次修改代码后会自动重启。示例:补充:forever、supervisor和pm2的区别>foreverforever是一个简单的命令式nodejs的守护进程,能够启动,停止,重启App应用。forever完全基于命令行操作,在forever进程之下,创建node的子进程,通过monitor监控node子进程的运行情况,一旦文件更新,或者进程挂掉,forever会自动重启node服务器,确保应用正常运行。适用场景:管理多个站点,每个站访问量不大并且不需要监控。用法:foreverstart/stopmyapp.js>supervisor一旦有文件更新,立即重启应用程序。适用场景:开发环境中使用。用法:supervisormyapp.js>pm2提供了先进完整的Node多进程管理解决方案。适用场景:网站访问量比较大,需要完整的监控界面。用法:pm2start/restart/stopmyapp.js--->启动/重启/停止myapp应用程序pm2logs--->在控制台打印日志pm2monit--->监视各个进程的运行状态(CPU占用、内存消耗)pm2startmyapp.js-iNUM--->以多进程的方式启动应用程序,相当于是创建一个应用程序集群。其中NUM表示进程数量,NUM=0时表示使用所有CPU核心。pm2startmyapp.js--watch--->当应用程序中的文件发生变化时,自动重启应用。pm2deletepid/app_name--->删除指定进程,pm2deleteall表示删除所有进程。除了支持常规命令启动外,pm2还支持执行JSON文件启动。用法如下:pm2startmyPM2.json在m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全面建筑材料采购合同样式
- 一次性购销合同的解除权条件
- 军事采购合同模板
- 科技服务合同的履行与监管
- 内墙涂装工程劳务分包合同
- 短途搬家装卸运输合同范本
- 2024楼宇电视广告合同
- 2024店铺店面装修合同范本
- 低温仓储与商品运输时效分析考核试卷
- 智能电子音箱的智能语音识别与播放考核试卷
- 一元一次不等式组-含参问题课件
- 叉车日检保养目视化看板指引
- 工程竣工预验收质量问题整改通知单
- 广东省地图模板课件
- 口腔新店开业盛典活动策划案
- 人教版七年级上册 句型转换专项练习(三)
- 建设工程资料用表(全套)
- 学校反恐防暴应急演练记录
- 部编版四年级道德与法治上册教学计划表及全一册教案(共12节)
- 初一语文部编版七年级上册《猫》任务学习单(公开课定稿)
- 恶性肿瘤骨转移治疗临床路径
评论
0/150
提交评论