node.js

189 阅读8分钟

Node.js

是一个环境,能够让开发者使用Javascript开发服务端功能

历史上第一次一门语言可以通吃前后端

node.js最大的特点: 1、快、非常快 - 以前最快的是php,node.js速度是php的十六倍 2、为什么快:1、因为官方提供的东西少,甚至连数据库API都没有提供过 2、使用了google浏览器的v8引擎

案例:使用bootstrap+jquery+node:图书管理系统
	要求:
	  1、搭建服务器和文件系统 - 别人也能访问你
	  2、搭配上MySQL数据库(增删改查) - 有的东西是同步的,有的东西是异步的,路由的写法-随意,node.js中所有的src/href/action/location - 都称之为是一个路由请求

1、Node.js概述

不是JS,但是语法和javascript非常相似,他的竞争对手java、php、c#、python... 
		做的功能绝对不是特效,做的事和服务器端一致(和数据库进行交互)
		目的:
		1、使用代码搭建一个服务器(服务器文件可以放在任何位置,并且不会安装上一些我不需要的东西)
		2Node.js如何沟通前端与数据库

2、Node.js安装

node-v12.1.0-x64.msi - 一路往下点,哪里点不动了,就把那里勾上,不要取消任何东西
	版本:16年初(0.1216年中(4.xx)	16年末(6.xx) - 更新速度很快,意味着:发展迅速,其实也没加什么新东西,就是一些不好的方法更新了一下
	检查:打开cmd输入:node -v - 查看版本号,如果有版本号说明已经安装成功
	其实我们安装的这个node.js就是一个运行环境而已,不需要浏览器了

3、Node.js如何运行

	1、交互模式 - 临时测试
	   打开cmd输入:node回车,就可以开始敲你的"js"代码了

	2、脚本/文件模式 - 正式开发中
		1、先创建xx.js:里面书写自己的代码
		2、打开cmd输入:node 文件绝对路径

	3、编辑器有插件:
		1、vscode:code runner - 文件代码处右键
		2HBuilder:nodeeclipse - 右键运行
		插件想要成功,必须保证前两个cmd方式能用

4、Node.js的知识

(1)、js 和 node的区别

相同点:都可以使用一切的ECMAScript的一切API都可以使用,放心大胆的用,在服务器端不存在浏览器,就不会有任何兼容问题
		不同点:1、javascript:DOM+BOM - 做特效
			2Node.js:虽然不能用DOM+BOM,但是他却有10万个以上的模块(新增了一些只适合服务器环境的语法),http、fs、path、url

(2)、模块:每一个.js文件,都可以称之为是一个模块

1、模块化开发:如果以一个网站来说,我们可以按照功能分为很多模块:商家模块、产品模块、促销模块、用户模块、商品模块...
				分工合作:将每个模块交给对应的人完成,最后再由【主模块】进行引入:
			1、每一个模块都有一个操作,可以用于公开/暴露自己的成员
				1exports.属性名=值;
				2module.exports={
					属性名: 值,
					...
				   }

			2、每一个模块都有一个操作,可以用于引入其他模块
				var xxx=require("./文件名"); //引入时的./不能省略

鄙视题:exports和module.exports有什么区别?

			都是用于暴露公开自己的成员的
			但是:exports={}; 写法是错误的
			node.js底层有一句话:exports=module.exports;
			其实真正做公开功能的是module.exports
			如果你使用了 	     exports={};覆盖了module.exports,不在具有公开功能

(3)、模块的分类

【1】、官方模块 -大概了几十个,重要的只有几个

不需要下载,在你安装node.js环境的就已经带上了,但是某得模块可能需要引入,某得模块不需要引入

1、Global模块:


			不需要引入,直接可以使用
			提供:
			  1、三种定时器(IntervalTimeoutImmediate) - 其实这些定时器也不是曾经的定时器了,功能和以前一样
				Immediate 底层:Timeout延时为0,但是毕竟是异步操作,不会卡住后续代码
			  2console控制台
			  3、提供了5个变量给我们,可以直接使用:
				1、*exports - 公开/暴露自己的成员
				2、*require - 引入其他模块的
				3、__filename - 获取当前文件完整的绝对路径
				4、*__dirname - 获取当前文件绝对路径,不包含此文件的名字:何时:vscode某的同学可能不支持在node.js书写相对路径,只能写绝对路径
				5、*module - 指代当前模块本身

2、querystring模块:查询字符串

			需要引入:var qs=require("querystring");
			提供了解析url查询字符串部分的功能
			var obj=qs.parse("查询字符串")
			想要获取前端传来的每一部分:obj.键名;
			垃圾:如果前端传来的是一个完整的url网址,他就解析不了了

3、url模块 - 小重点

			需要引入:var url=require("url");
			提供了解析url各个部分的功能
			var obj=url.parse("网址",true);//支持第二个参数,是一个布尔值,默认为false,一旦设置为true,自动使用querystring模块的parse方法,解析查询字符串
			真正的重点:
				1、查询字符串:obj.query.键名; - 拿到前端传到后端的东西
				2、路由/请求地址:obj.pathname; - 判断路由的不同,去读取不同的HTML发送给用户看

4、Buffer模块:缓冲区,可以将数据变成一个16进制的数字

			不需要我们去引入,直接可以使用
			我们绝对不会主动使用buffer的任何操作,但是后面的一些API可能会导致我们得到的结果直接就是一个buffer结果,而且有的API还就支持buffer操作

5、fs模块 - 大重点:文件系统:用代码对文件进行增删改查

			需要引入:var fs=require("fs");
		       *异步读取文件:fs.readFile("文件路径",(err,buf)=>{
						buf->读取到的内容
				      })

			异步写入文件:fs.writeFile("文件路径","新内容",(err)=>{ - 会替换掉原有的内容
						//执行写入完毕后要做的操作
				      })

			异步追加文件:fs.appendFile("文件路径","新内容",(err)=>{ - 会替换掉原有的内容
						//执行写入完毕后要做的操作
				      })

6、http模块 - 超级重点:搭建服务器的

			固定步骤:
			需要引入:var http=require("http");
				var app=http.createServer();
				app.listen(80);
				app.on("request",(req,res)=>{
					//req->request,保存请求对象:保存着前端传来的请求相关的数据:req.url->路由&查询字符串部分
					//res->response,响应对象:后端也可以响应一些东西给前端看:res.end();、
				})
			详见:node.js教学资料中12.js

		感悟:一切的src和href都是一个请求/路由,这个请求就需要后端来解析,根据不同的请求会跟我们不同的响应

【2】、第三方模块 -

多到数不清,提供了很多官方模块没有的东西,有一个网址npm可以去下载:mysql、express框架

如何去使用第三方模块:npm:node package manager:node的包/模块管理器:专门管理第三方模块的:作用:下载、更新、删除、维护包的依赖关系
	打开网站:npm官网
	搜索你需要用到的模块:尽量用带有完全符合版标签的那个包
		1、打开cmd:检查npm是否安装成功:npm -v
		2、下载:npm i 包名 //i:install:安装
		3、更新:npm up 包名 
第三方模块包:mysql如何使用
	1、需要引入:var mysql=require('mysql');

	2、后端<=>数据库:
		1、创建数据库的连接对象
		var conn = mysql.createConnection({
  			host     : '127.0.0.1',
  			user     : 'root',
  			password : '',
  			database : 'h52107'
		});

		2、创建SQL语句
		var sql="INSERT/DELETE/UPDATE/SELECT";

		3、执行SQL语句
		conn.query(sql, (err,result)=>{
  			console.log(result);
			//增删改:成功OK对象,失败undefined
			//查:成功获得的是一个JSON对象:[{},{},{},{},....]
		});	

		4、断开和数据库的连接
		conn.end();

	3、前端<=>后端
		1、前端发起请求:2种:
			1、表单:发起同步请求
			2、ajax:发起异步请求,获取后端响应的数据
                        
		2、后端怎么接住前端的东西,并且发送响应给前端
			1、搭建服务器
			2、判断好路由
			3、objUrl.query - 保存住前端传来的查询字符串部分
			4、响应数据:res.end(JSON.stringify(json));//响应

【3】、自定义模块

自己书写的js:require("./模块名")
为什么有的模块引入要./有的不用./
	自定义模块:分为2大种操作方式:
		1、文件模块:创建xx.js去公开需要公开的内容,主模块想要引入必须写为require("./模块名")

		2、目录模块:31、比如创建m1的文件夹,在其中创建index.js的文件,去公开需要公开的内容主模块想要引入必须写为require("./m1")
			2、比如创建m2的文件夹,在其中创建xx.js的文件,去公开需要公开的内容主模块想要引入必须写为require("./m2")
			   必须在创建一个package.json的配置文件,写入:{"main":"xx.js"}
			3、创建一个文件夹必须名为:node_modules,再在其中创建一个名为m3的文件夹,再在其中创建index.js
			   去公开需要公开的内容,主模块想要引入必须写为require("m3")

			其实真实开发中,我们程序员用的最多的就是文件模块,目录模块的第三种方式其实根本就不是人用的(第三方模块下载后自动创建此文件夹)