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

备注-Node.js基础开发指南

时间:2023-04-03 10:56:48 Node.js

实现监控代码修改自动重启:supervisor如果你有PHP开发经验,在开发Node.js时,你会习惯修改PHP脚本后直接刷新浏览器观察结果。js实现你会发现,无论修改哪部分代码,都必须终止Node.js并重新运行才能生效。这是因为Node.js只会在第一次引用时解析脚本文件,以后会直接访问内存避免重复加载,而PHP总是重新读取并解析脚本(如果没有特殊优化配置)。Node.js的这种设计虽然有利于提高性能,但是对开发调试不利,因为我们在开发过程中总是希望修改后立即看到效果,而不是每次都终止进程重新启动。supervisor可以帮你实现这个功能,它会监控你对代码的修改,并自动重启Node.js。使用方法很简单,首先使用npm安装supervisor:$npminstall-gsupervisor如果你使用的是Linux或者Mac,直接输入上面的命令可能会导致权限错误。原因是npm需要安装supervisor到系统目录下,需要管理员授权。您可以使用sudonpminstall-gsupervisor命令来安装它。接下来使用supervisor命令启动app.js(可以根据情况更改,比如当前需要启动:supervisor./bin/www):$supervisorapp.jsDEBUG:Runningnode-supervisorwithDEBUG:程序'app.js'DEBUG:--watch'.'调试:--extensions'node|js'调试:--exec'node'调试:使用'nodeapp.js'启动子进程调试:监视目录'/home/byvoid/.'进行更改。HTTP服务器监听3000端口,当代码改变时,运行的脚本会被终止,然后重新启动。终端显示的结果如下:DEBUG:crashingchildDEBUG:Startingchildprocesswith'nodeapp.js'HTTPserverislisteningatport3000.supervisor这个小工具可以解决开发中的调试问题。安装Express后(npminstall-gexpress)无法在命令行全局调用express时,使用express命令失败,原因有以下两种。原因一:安装的express是4.0以上的版本。express4.0之后需要安装可执行文件(executorexpress-generator)来执行express命令。解决方法:安装express-generatornpminstallexpress-generator-g;原因二:1)如果你用sudoapt-getinstallnodejs命令安装nodejs,为了避免安装时出现包冲突,把nodejs的命令操作改成nodejs而不是node。2)由于安装express时默认的nodejs命令是node,所以安装后express命令不起作用。我的理解是express命令根据节点名称继续其他操作:例如。可能是这样一个节点xxx,然后在其他命令xxx中组合成一系列的表达操作。node命令既然没用,express自然也就失去了原有的作用。解决方法:1)如果express版本是4.0以上,进入usr/local/lib/node_modules/express-generator/bin目录,将express文件第一行改成:#!/usr/bin/envnodejs2)如果express的版本是4.0以下,进入/usr/local/lib/node_modules/express/bin目录,修改express文件第一行,如下:#!/usr/bin/envnodejsroutingresponsecontroltransferExpress支持将多个路由响应函数绑定到同一个路径,例如:app.all('/user/:username',function(req,res){res.send('allmethodscaptured');});app.get('/user/:username',function(req,res){res.send('user:'+req.params.username);});但是当你访问这两个相同规则匹配的任何路径时,你会发现请求总是被前面的路由规则捕获,而后面的规则将被忽略。原因是Express在处理路由规则时,会优先匹配先定义的路由规则,所以相同的规则后面会被屏蔽掉。Express提供了路由控制传递的方法,即回调函数的第三个参数next,通过调用next(),将路由控制传递到如下规则,例如:app.all('/user/:username',function(req,res,next){console.log('allmethodscaptured');next();});app.get('/user/:username',function(req,res){res.send('user:'+req.params.username);});访问匹配的路径,如http://localhost:3000/user/carbo,会发现终端中打印了所有捕获的方法,浏览器显示user:carbo。这说明请求首先被第一条路由规则捕获,console.log使用next()完成传递控制,然后被第二条规则捕获并返回信息给浏览器。ejs的标记系统<%code%>:JavaScript代码。<%=code%>:显示替换了HTML特殊字符的内容。(routes的js文件中返回的内容)<%-code%>:显示原来的HTML内容。<%#code%>:注释标签,不执行,不输出。<%%%>:输出文字'<%%>'-%>:修剪模式('newlineslurp')标签,删除后续换行错误:发送后无法设置标题。(控台)ReferenceError:bodyisnotdefinedateval(page)基本上好像是说headers已经传到page了,所以不能再设置了。原因:在layout.ejs中,<%-body%>用来表示这部分内容对于每个模板文件都是唯一的。在admin.ejs中,再次使用<%-body%>会报错。解决方法:在admin.ejs中,删除<%-body%>。也就是说,admin.ejs是/uses路由的默认模板,实际上需要通过layout.ejs来统一渲染。由于模板文件不是孤立显示的,默认所有模板都继承自layout.ejsREST设计模式常用的请求方式GET:getPOST:addPUT:updateDELETE:deleteHEAD:请求指定资源的响应头TRACE:return服务器接收到的请求主要用于测试或诊断CONNECT:HTTP/1.1协议是为代理服务器保留的,可以改变连接到管道。OPTIONS:返回服务器支持的HTTP请求方法。