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

第33天NodeJS

时间:2023-04-03 10:06:53 Node.js

1.NodeJS简介1)什么是JavaScript?JavaScript是一种运行在浏览器端的脚本语言,用于与客户端页面进行交互。2)JavaScript的运行环境如何?顾名思义:它的运行环境就是浏览器,但真的是这样吗?其实它真正的运行环境其实就是运行在浏览器内核中的js引擎。为什么会这样?因为一般来说,浏览器的作用就是浏览网页。除了执行js,我们还可以在浏览器中执行其他的东西。例如,我们可以通过在浏览器中输入地址并回车来发送请求和接收来自服务器的响应。.所以浏览器的第一个功能就是请求一个http地址,也就是可以封装一个请求报文,把一个url地址封装成一个请求报文,把这个报文发给服务器,然后给我们一个响应报文,然后解析响应,这也是浏览器最大的功能。当然,服务器响应的内容可能不同。比如服务端返回html文件、css文件、img文件进行渲染。我们称之为渲染引擎。另外js也可以被js引擎执行,所以可以说javascript的运行环境是浏览器中的js引擎,而不是浏览器。浏览器是一个很大的概念。3)浏览器中的javascript可以做什么?前面说了javascrip是用来交互的,但是总的来说交互有点不清晰。具体可以分为:操作dom(即增删改dom,注册事件等)发送AJAX请求/跨域BOM交互比如为我们提供页面跳转,历史记录,控制台打印logsecmascript(js的核心语言,比如用来定义变量、函数等)4)浏览器端的javasscript有什么不能做的?通过之前的了解,javascrip似乎可以完成我们日常的交互,似乎无所不能,但也有它做不到的事情。例如:在端到端的应用中,我们需要对文件进行操作。浏览器中的JavaScript无法执行文件操作。h5虽然提供了与文件相关的API,但是这些API大多局限于只读级别。不能像java等传统语言,传递一个路径,然后读出对应的文件。说白了就是不能进行文件间的CURD;浏览器端的javascript也没有办法对操作系统进行操作,比如获取操作系统版本之类的;那么为什么这两类操作不能做呢?其实是出于安全考虑,因为js语言运行的环境比较特殊。如果特别,特别的地方是什么?虽然我们写的js代码最终还是会放在服务器上,但毕竟不是在服务器上执行,而是通过服务器发送给浏览器执行。在浏览器上执行文件显然是不安全的。所以,并不是这些功能不能在客户端完成,而是运行环境特殊。5)javascrip只能在浏览器端运行吗?了解了客户端js可以做什么之后,我们还要明确一个概念,那就是javascrip只能运行在浏览器端吗?前端开发者都知道javascrip是由ecmascrip语言、BOM、DOM组成的。在语言层面,她只是给我们提供了一些操作语法,比如定义变量、函数、类型、流控操作等。BOM和DOM是浏览器提供的,不是es提供的。所以,我们常说的js其实就是es。js的大部分功能(DOm、BOM(浏览器打开的API)等操作)是由浏览器的执行引擎决定的,这也导致了一个观点。对于任何一种编程语言来说,其能力不是由语言本身决定的,而是由其执行环境决定的。例如,java既是一种语言又是一个平台。对于javascript,语言是es,平台是浏览器。那么js只能在浏览器中运行?不!对于大多数语言,它们都在一个平台上运行。比如java只运行在虚拟机上,但是也有运行在多平台上的语言。Java不需要在某个级别上运行在多个平台上。因为虚拟机是跨平台的(即window、linux等跨操作系统)。js也可以在多个平台上运行。浏览器之所以能运行js,是因为它有js执行引擎。js也是一样,只要有平台支持他,就可以执行。因此,要想语言有非常强大的功能,只需要提供一个强大的平台即可。Node就是这样一个可以执行js的平台。那么节点到底是什么?6)什么是节点?节点平台=JS引擎+海量新API;根据官方文档,node是Googlev8引擎的javascript运行平台,可以理解为运行js的虚拟机。他使用事件驱动的非阻塞I/O模型。他把js运行环境搬到了服务端,跟客户端没有关系。是纯服务端的东西,node只是给js提供了一个平台。node里面其实有两部分,一是封装v8引擎,目的是执行es(比如定义变量,定义函数等),二是提供了大量的工具库帮助node实现各种功能,提供一些在以前的js环境下做不到的事情,比如文件操作,网络操作,操作系统操作等。既然node是一个平台(所谓的平台是用来运行特定语言的),那么也就是说node是用来运行一种语言的,那么java也是一种语言,node能不能运行java呢?据nodejs创始人RyanDahl回忆,他最初选择了Ruby语言,但是Ruby语言的虚拟机效率不是很好,最后放弃了。按照这个思路,Node似乎可以集成Java虚拟机。运行java,但节点作者最终选择了javascript。这样js就实现了运行在服务端的可能。js运行在node平台上(分为v8部分,用来执行es,还有大量的工具库组件(API)叫做libuv,它提供了以前js环境管理不到的东西,比如文件操作,网络操作,ETC。)。知道什么是node,你应该也知道node在web中有什么用?(1)node可以接受客户端用户的所有请求,并且可以快速响应,所以node可以作为网站使用。(2)Node可以作为中间层来分发和调用数据接口。比如有一个java提供的网站数据,我们可以使用node作为中间层接受用户请求,然后通过node调用java数据接口,获取到数据后,直接在node层做HTML封装,然后直接将渲染后的页面交付给用户。你为什么要这样做?不能直接请求java接口吗?这是因为node号称是高性能的web服务器,在并发和抗压方面比传统平台要好很多,所以这样的封装可以大大降低服务器的工作量。发展。通过以上两点可以得出结论,在web中,node要么提供从前端页面到后端的全包服务,要么只做其中的一个。总之,node是一个javascript运行环境(平台),它不是一种语言,也不是一个javascript框架。它可用于开发服务器端应用程序和网络系统。其特点是体积小、速度快、性能高。简单来说,Node.js就是运行在服务器端的JavaScript。Node.js是一个构建在Chrome的JavaScript运行时之上的平台。Node.js是一个事件驱动的I/O服务器端JavaScript环境。基于谷歌的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。2.安装node环境中文官网:http://nodejs.cn可以使用cmd(window+r打开cmd)node-v命令查看当前Node版本;注意:不同版本可能存在差异3.运行Node.js程序运行步骤:1)创建helloWorld.js文件console.log("helloworld");2)HBulider->文件->在外部资源管理器中打开->地址栏cmd+回车->node命令nodehelloWorld.js执行程序(tab键自动补齐文件名)通过http模块创建服务器:如果我们使用PHP来编写后端代码,我们需要一个Apache或NginxHTTP服务器来处理客户端的请求。但是对于Node.js来说,概念就完全不同了。使用Node.js时,我们不仅仅是在实现一个应用程序,而是在实现一个完整的HTTP服务器。js文件:1)导入http模块2)http.createServer()方法创建服务器,函数通过request和response参数接收和响应数据3)listen()方法绑定端口//1.导入http模块consthttp=require("http");//2.创建服务器,回调函数表示收到请求后做什么letserver=http.createServer(function(req,res){res.writeHead(200,{"Content-type":"text/html;charset=utf-8"});res.write("haha");res.write("xixi");res.end(end);});//监听server.listen(8866);node命令编译->浏览器运行:127.0.0.1:8866或者浏览器ip地址:端口号所以:我们在本地写一个js文件,不能直接拖到浏览器运行。但是有了node,我们的任何一个js文件都可以通过node运行。也就是说,node是一个js执行环境。4.Node.js中的模块化JavaScript是一种强大的面向对象语言,具有许多快速高效的解释器。然而,JavaScript标准定义的API旨在构建基于浏览器的应用程序。没有适用于更广泛应用的标准库。CommonJS规范的提出主要是为了弥补标准JavaScript的不足。它的最终目标是提供一个类似于Python、Ruby和Java的标准库,而不是仅仅停留在小脚本程序阶段。使用CommonJSAPI编写的应用程序不仅可以使用JavaScript开发客户端应用程序,还可以编写以下应用程序。服务器端JavaScript应用程序。(nodejs)命令行工具。桌面GUI应用程序。CommonJS是模块化标准,nodejs是CommonJS(模块化)的实现。Node应用程序由模块组成,使用CommonJS模块规范。在Node中,模块分为三类:一类是Node提供的模块,称为核心模块,如http模块、fs模块;另一种是用户编写的模块,称为文件模块;三是第三方Modules;CommonJS(Nodejs)中自定义模块的规则:我们可以将公共函数提取到一个单独的js文件中作为一个模块。默认情况下,无法从外部访问此模块中的方法或属性。如果想让外部访问模块中的方法或属性,就必须通过exports或module.exports暴露模块中的属性或方法。在需要使用这些模块的文件中,通过require导入这个模块。这时候就可以使用模块中暴露的属性和方法了。案例:7-CommonJS.js:使用require,导入模块注意:同级./不能省略;后缀.js可以省略;//导入模块:require(模块名称),返回模块对象consta=require("./7-config.js");console.log(a.str);a.fun();7-config.js:使用exports或module.exports暴露属性或方法//export规则letstr="xixi";exports.str=str;functionfun(){console.log("haha");}//module.exports和exports等同于module.exports.fun=fun;注意:以上两个文件只需要编译7-CommonJS.js文件即可运行;ES6:1)在html文件中,使用脚本的src属性导入导出的文件,type值为module2)export暴露属性和方法,注意没有s3)import{propertyorfunction...}frompath;import{str,add}from"./8-ES6config.js";8-ES6.html文件:8-ES6config.js文件导出letstr="666";exportfunctionadd(a,b){returna+b;}8-ES6CommonJS.js文件//从路径导入{属性或函数...};从“./8-ES6config.js”导入{str,添加};console.log(str);console.log(add(1,2));5.packages和npmpackages除了自身提供的核心模块外,Nodejs可以自定义模块,也可以使用第三方模块。Nodejs中的第三方模块是由包组成的,包之间可以相互依赖一组包。统一管理的模块。在NodeJs中,使用npm命令下载第三方模块(包)https://www.npmjs.com/package...命令:npmisilly-datetimei是install的缩写-》安装完成后,会在文件夹中自动下载一个包constsd=require("silly-datetime");console.log(sd.format(newDate(),'YYYY-MM-DDHH:mmjs));node9-npm.js命令运行:npm是和node一起安装的,下载node之后必须安装npm。2)NPM简介npm是世界上最大的开源生态系统,我们可以通过npm下载各种包,我们可以找到这些源码(packages)athttps://www.npmjs.com;npm是一个随NodeJS一起安装的包管理工具,可以解决NodeJS代码部署问题很多,常见的使用场景如下:(安装npmwithnode,下载node后必须安装npm。)允许用户从npm服务器下载他人编写的第三方包供本地使用。(愚蠢的日期时间);允许用户从NPM服务器上下载并安装他人编写的命令行程序(工具)供本地使用。(导师);允许用户将自己的包或命令行程序上传到NPM服务器供其他人使用。3)npm命令详解npm-v//查看npm版本使用npm命令安装模块npminstallModuleName例如安装jq模块npminstalljquerynpmuninstallmoudleName//卸载模块npmlist//查看节点包installedinthecurrentdirectorynpminfomodule//查看模块的版本npminfojquery查看jquery的版本4)节点自动重启工具nodemon为什么要用nodemon?在编写和调试Node.js项目时,修改代码后,需要经常手动关闭再重启,比较麻烦。现在,我们可以使用nodemon这个工具,它用来监控代码文件的变化,当代码发生变化时自动重启。如何使用节点?npminstall-gnodemon安装后直接使用nodemonjs文件名6.fs模块(文件和目录操作)首先引入fs文件流://fs:filestreamfilestreamconstfs=require("fs");fs模块的回调函数一定要写,否则会报错;1)读取文件fs.readFile()语法:fs.readFile(filepath,function(err,data){});//如果文件路径正确,则不会产生err;fs.readFile("2fs.txt",function(err,data){if(!err){//console.log(data);////toString()转换编码格式文件内容到字符流console.log(data.toString());}});node命令运行代码,结果在cmd窗口2)写文件fs.writeFile()写文件的本质是替换文件,如果源文件存在,直接替换;如果不存在,则创建一个新文件;语法:fs.writeFile(路径,写入内容,[写入方法],回调函数);写法:{flag:"a"/"w"}a:appendtoappendw:write(default)fs.writeFile("2fs.txt","It'sraining",{flag:"a"},function(){});//node运行命令,然后在2fs.txt中点击鼠标查看结果3)创建文件夹fs.mkdir()fs.mkdir(文件夹名,回调函数);fs.mkdir("mycss",function(){});//在同一个路径下,创建一个文件夹4)Appendfilefs.appendFile()fs.appendFile(path,content,callbackfunction);fs.appendFile("2fs.txt","我有一只小驴",function(){});5)删除目录fs.rmdir()fs.rmdir(目录名,回调函数);fs.rmdir("mycss",function(){});6)删除文件fs.unlink()fs.unlink(文件名,回调函数);fs.unlink("1-fs.txt",function(){console.log("文件删除成功");});7)判断路径是指向文件还是文件夹fs.stat()fs.stat("css",function(err,stat){if(!err){console.log(stat.isDirectory());//trueconsole.log(stat.isFile());//false}})7.路由官方解释:路由是由一个URI(或路径)和特定的HTTP方法(GET、POST等)组成,涉及到应用程序如何响应客户端对某个网站节点访问的请求非官方解释:路由指的是针对不同请求的URL,处理不同的业务逻辑。这种情况下,创建一个服务器,运行或者自动监听js文件,然后在浏览器中输入127.0.0.1:8850/login,就会返回login.html页面。注意:端口号可选范围为0-65535,但8000以下已被固定软件占用,如http端口为80,8848为apach服务器,3366为mysql服务器。我们一般使用8000以上的端口号。consthttp=require("http");constfs=require("fs");http.createServer(function(req,res){res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});//req.url代表斜杠后的名字console.log(req.url);///login//在浏览器地址栏输入127.0.0.1:8850/login,会满足以下条件if(req.url=="/login"){fs.readFile("login.html",function(err,data){if(!err){res.end(data);//显示登录.html页面}});}elseif(req.url=="/admin"){res.end("admin");}elseif(req.url="/res"){res.end("register");}}).listen(8850);//注意端口号不能被其他htm文件占用:

  • 我才是真正的登录页面
/favicon.ico自带,无需管