当前位置: 首页 > 后端技术 > Node.js

后端知识点总结——NODE.JS基础

时间:2023-04-04 01:34:12 Node.js

后端知识点总结——NODE.JS基础1.Node.jsNode.js不是JS,它是一个软件开发平台,它的竞争对手就是JSP/PHP/ASP.NET,历史上第一次有一种语言可以把前后端全部搞定。网址:阿里云镜像https://npm.taobao.org/mirrors/node/版本:0.12(16年初)4.x(16年中)6.x(2016年底)LTS:LongTermSupportCurrent:最新版本JSP=HTML+JAVA强大可靠,适合大型企业级项目PHP=HTML+PHP简单易用,适合互联网项目ASP.NET=HTML+C#简单易用,适合windows平台30w==2w+0.5w+20w+10wNode.JS=HTML+”JS”性能好,适合服务器端IO密集型项目,不适合CPU密集型项目CPU密集型项目:滴滴打车,天气预报,大数据分析,大数据计算..IO密集型项目:查询,修改,删除,2.Node操作的两种方式(1)交互模块---简单理解(测试新功能)REPL:输入一行代码执行一个line注意:交互模式自带输出功能,不需要console。log()节点回车进入交互模式。exitExit(2)脚本模块——用于官方项目,将所有要执行的语句写在一个文本文件中(后缀Any,no),一次性提交给节点解析器执行。node全路径/x.js回车提交:只要安装成node.js,重启webstorm,ws会自动找到node.exe解析器,新建项目和文件必须写成UTF-83.nodejs中的Uniqueconcept——模块——(强调)一个项目中的多个“模块”,订单模块、用户模块、支付模块……node.js可以将函数和对象按照功能分别存放在不同的文件或目录下,这些目录和文件在node.js04_node.js05.js中被称为一个“模块”##注意:Node.JS的每个模块都是一个独立的构造函数,Node.JS解析器会自动为每个.js文件添加添加以下代码。(function(exports,require,module,__filename,__dirname){exports:{}用于声明将自己的成员导出到外部require:fn用于导入其他模块并创建指定的模块对象module:当前模块对象__filename__dirnamevari=10;varj=11;console.log(i+j);});4.Node.js模块中的exports和module.exports对象有什么区别?两者都可以用来导出自己的内部成员,但是:实际的导出成员module.exportsexports对应的是引用。每个模块都可以使用自己的require();importanothermodule——本质是创建指定模块的对象实例。08_data.js声明两个变量一个函数->导出一个变量一个函数09_app.jsimport5.nodejs模块-目录模块两种形式的自定义模块(1)文件模块创建一个JS文件,比如m3.js,导出其public数据,其他模块你可以要求(“./m3”);import(2)directorymodule方法一:创建一个目录,假设为m4,在里面创建一个index.js文件,导出需要public的数据其他模块导入varm=require(“./m4”);方法二:新建一个目录,假设为m5,在里面新建5.js文件,导出需要public的数据,新建package.json文件main并指定启动文件5.js其他模块importvarm=require(“./m5”);方法三:创建一个目录,必须命名为node_modules,然后创建一个目录module,假设m6创建了一个package.json文件,里面声明了main属性指定默认执行的启动js,比如6.js,其中导出需要公共数据,导入其他模块require("m6");文件模块目录模块(方法三)程序结构m1.jsnode_modulesm2package.json2.js模块名m1m2exportdatamodule.exportsmodule.exportsimportmodulevarm=require(“./m1”);varm=require(“m2”);6.Node.js解析引擎自带一个原生模块—Buffer(缓冲区)Buffer:缓冲区,本质上是一块内存区域,用于临时存放数据(数字、字符串、二进制图像/音频/视频),这些数据将在解析过程中使用未来。该区域称为“缓存”。建议配置指定大小为1024字节的缓冲区。:缓冲区大小不超过512KB512*1024varbuff1=Buffer.alloc(1024);使用数组创建缓冲区varbuff2=Buffer.from([1,2,3]);使用字符串创建缓冲区varbuff4=Buffer.from("abc");将缓冲区内容转换为字符串{如果缓冲区数据是字符串}varstr=buff4.toString();Node.js原生模块——QueryStringquerystring模块,用于处理HTTP请求QuerystringinURLvarobj=qs.parse(str);Parsequerystringtojsobjectvarstr=qs.stringify(obj)Convertjsobjecttoquerystring点头e.js原生模块——URLurl模块,用于解析一个HTTP请求地址,并获取其中的各个部分varobj=url.parse(str);把一个URL地址转成一个js对象varobj=url.parse(str,true);功能同上,将query字符串转为jsobjNode.js原生模块—fs—(key)文件:在node.js中,我们的系统文件或目录统称为文件。文件内容(1)同步读写文件(阻塞)同步读取文件内容vardata=fs.readFileSync(fileName);将内容同步写入文件fs.writeFileSync(fileName,data);注意:(1)如果当前写入的文件不存在,则自动创建a.txt(2)如果当前目录不存在,报错d:/abc/a.txt(3)如果当前文件已经有内容,清除并同步追加内容到文件中fs.appendFileSync(fileName,data);(2)异步读写文件(非阻塞)异步读取数据fs.readFile(fileName,function(err,data){});功能:读取文件后调用err:读取文件不存在,权限不足,自动创建错误对象#异步写数据fs.writeFile(fileName,data,function(err){})功能:文件写入结束调用#异步追加数据fs.appendFile(fileName,data,function(err){})功能:文件末尾追加Node.js原生模块--httpHTTP模块可用于编写基于HTTP协议的客户端程序(即浏览器),以及也可以写一个基于HTTP协议的服务器(APACHE)APACHE[1000并发数量]nginx[28000]IIS[微软]用http模块写一个web服务器(1)createserverobjectvarserver=http.createServer();(2)绑定监听端口1-65535server.listen(3000);(3)接收客户端请求,server.on(“request”,(req,res)=>{..})(4)并响应客户端消息res.end(str...);req:请求对象:保存客户端请求报文req.url请求url地址res:响应对象:服务端向客户端发送数据,修改响应格式三种常用对象:(1)server代表服务器对象(2)req(request)请求对象,里面保存了很多客户端信息req.url客户端请求地址req.method客户端请求方法req.httpVersionHTTP版本req.headers请求头(3)res(response)响应对象,保存发送的数据服务器给客户端res.statusCode=200;res.setHeader();设置响应头res.write();将响应消息体输入到客户端res.end();通知客户端,响应消息结束(仅一次)常见错误:程序端口被占用listenEADDRINUSE:::3000解决方法:找之前的程序停止11.node.js第三方模块(mysql/express)使用node.js访问mysql为了精简NODE.JS解析器,服务器官方不提供任何数据库相关模块的访问。您必须使用工具npm下载第三方模块。在www.npmjs.org搜索关键字Mysql可以得到相关模块和每个模块的说明。示例:下载npminstallmysql简称npmimysqlmysql模块使用步骤(1)复制模块node_modulesday03根目录(2)加载mysql模块constmysql=require(“mysql”);(3)创建到数据库服务器的连接varconn=mysql。createConnection({})(4)发送sql语句,得到服务器返回的结果conn.query(sql,(err,result)=>{});(5)关闭连接conn.end();12.nodejs第三方模块express(key)下载express模块??npmiexpresshttp高级模块npmibody-parser处理postrequestsnpmicookie-parser处理cookienpmiexpress-session处理sessionnpmicorscross-domainexpressmodule使用官方的HTTP模块可以创建webserver应用,但是这个模块很底层,并且处理各种情况比较麻烦建议使用HTTP高层模块,express——第三方模块,是基于node.jshttp模块的高层模块,简化服务端开发。(1)下载模块npmiexpress(2)将模块内容复制到项目中的day04/node_modules(3)加载对应模块http/express(4)创建express对象,然后创建server对象,并绑定监听端口varapp=express();varserver=http.createServer(app);服务器.listen(3000);一般语法规则:app.get(请求地址,回调函数);接收客户请求GET/index.htmlapp.get(“/index.html”,(req,res)=>{});接收客户请求POST/index.htmlapp.post(“/index.html”,(req,res)=>{});示例:之前:login.php参数数据库json$.get(“login.php”,…..);现在:app.get(“/login.do”,(req,res)=>{参数数据库json});$.get(“/login.do”...);13.expressreqandresobjectres.sendFile(__dirname+fileabsolutepath);=fs.read+res.write+res.endres.send(返回html字符串响应给客户端);res.json(obj);=setHead()+JSON.parse()+res.write()+res.end()表示GET请求到两种方式接收参数#GET/login.do?uid=10&uname=tomapp.get(“/login.do”,(req,res)=>{//表示添加属性queryreq.query.uid;req.query.uname;});GET/login.do/12/tomapp.get(“/login.do/:uid/:uname”,(req,res)=>{//express添加一个params属性req.params。uidreq.params.uname});14.为了提高项目效率?创建连接池(1)create连接池varpool=mysql.createPool({...});host;user;password;connectionLimit:5连接池中5个活跃连接的建议范围:5~251亿(PV/1day)=8小时=28800秒=10-100=34/s100000000/28800/100=(2)所有应用程序租用连接pool.getConnection((err,conn)=>{});(3)返回连接conn.release();15、请求方法:HTTP协议请求方法:用于标识本次请求的目的。GET表示客户端想要“获得”指定的资源。POST表示客户端想要向服务器“上传/添加”指定数据。请求体中请求数据的PUT表示客户端要在服务器上“放”数据DELETE表示客户端要“删除”服务器上的指定资源16.发送请求浏览器发送GET请求回车地址栏中的url,然后按Enter/formGET/AJAXGET/hyperlink/jsjump/imgsrc浏览器发送POST请求FormPOST/AJAXPOST浏览器发送DELETE请求AJAX-DELETE浏览器发送PUT请求AJAX-PUT项目:{cross-domain}两台web服务器{nodejs服务器业务功能}{apaceh服务器接收请求并响应html静态资源}一台数据库服务器{datamysql服务器}扩展思路和知识储备注:如果客户端跨域请求服务器资源,顺序要保存session正常工作,需要在ajax请求中添加属性xhrFields:{withCredentials:true}17.项目瓶颈:数据库原理:数据库中的数据存储在磁盘上的某组文件中解决方案1:提供SQL查询效率SELECTuid,uname,ageFROMxz_user;数据库对象:索引提高查询效率[select];降低更新效率[update/delete/insert]什么项目用的:索引查询多updateless索引为什么快:工作原理美团速递:外卖{deadmind}数据库默认工作方式xz_??userADDINDEX(uname)SELECTuidFROMxz_userWHEREuname=“tom”;400w-?加索引前查询一条记录2s400w->加索引后查询一条记录0.00002s方案二:主从数据库服务器{一台服务器负责写入数据}{多台从服务器负责读取数据}方案三:内存级数据库服务器{NOSQL}数据读写极高Redis数据库读写速度过高->数据库压力过大{问题}cpu100%社区:php/mysql在线号t_online2服务器宕机$phpcount=1;->redis++--非常高效tts:学生登录8:45~9:30->mysql?Redis微博/微信博[like]120Redis(2)提升项目{PVPageView}高性能服务器/页面staticNginx/(3)安全角度SQL注入node.js?XSS攻击脚本oa[报销/申请办公用品/审批][确认]document.all.readonly=true过滤所有用户输入值/所有危险字符串判断DDOS??攻击向网站发送大量垃圾防火墙解决方案:网店->天猫->阿里云6G/s(4)数据分析数据挖掘(大数据/人工智能)18.中间件-(路由级中间件)1.Express是一个功能极简的web框架,完全由中间件组成。本质上,一个快速应用程序是由中间件系统组成的。2.中间件(Middleware)是一种可以访问请求对象和响应对象(reqrequest,resresponse)的函数,可以控制请求-响应过程。next中间件有一个参数next变量3.中间件功能包括执行任意代码修改请求和响应对象终止请求-响应循环[blocker]调用下一个中间件4.中间件分类应用层中间件(*)在路由层Middleware(*)ErrorhandlingmiddlewareBuilt-inmiddleware5.标准语法app.use(url,(req,res,next)=>{});url:拦截地址(触发地址)req:请求对象res:响应对象next:调用下一个中间件或路由6.路由中间件route=请求方法+请求地址+处理函数示例:app.get(“/list”,(req,res)=>{…})语法varrouter=express。路由器();//创建路由中间件对象router.get(“/find”,(req,res)=>{});router.post(“/list”,(req,res)=>{});module.exports=router;app.use("/user",router);http://127.0.0.1:3000/user/findhttp://127.0.0.1:3000/user/list(1)创建三个路由文件router/userRouter.js保存所有用户函数router/orderRouter.js保存所有订单函数router/productRouter.js保存所有产品功能app.jsvaruserRouter=require(“./router/userRouter”);varorderRouter=require(“./router/orderRouter”);varproductRouter=require(“./router/productRouter”);app.use(“/user”,userRouter);app.use(“/order”,orderRouter);app.use(“/product”,productRouter);http://127.0.0.1:3000/用户/列表http://127.0.0.1:3000/order/list