【Node.js】①

  1. 什么是Node.js

JavaScript 诞生于 1995 年,几乎是和互联网同时出现;Node.js 诞生于 2009 年,比 JavaScript 晚了 15 年左右。
在 Node.js 之前,JavaScript 只能运行在浏览器中,作为网页脚本使用,为网页添加一些特效,或者和服务器进行通信。有了 Node.js 以后,JavaScript 就可以脱离浏览器,像其它编程语言一样直接在计算机上使用,想干什么就干什么,再也不受浏览器的限制了。
Node.js 不是一门新的编程语言,也不是一个 JavaScript 框架,它是一套 JavaScript 运行环境,用来支持 JavaScript 代码的执行。用编程术语来讲,Node.js 是一个 JavaScript 运行时(Runtime)。
所谓运行时,就是程序在运行期间需要依赖的一系列组件或者工具;把这些工具和组件打包在一起提供给程序员,程序员就能运行自己编写的代码了。

解释器、标准库、本地模块等各种组件/工具共同支撑了 JavaScript 代码的运行,它们统称为 JavaScript 运行时。

Node.js 运行时主要由 V8 引擎、标准库和本地模块组成,尤其是本地模块的多少,从底层决定了 Node.js 功能的强弱。
V8 引擎和众多本地模块都是现成的,别人已经造好了轮子,Node.js 的主要工作就是选择合适的模块,将它们集成在一起,并编写好 JavaScript 接口。

当然,并不是所有的本地模块都能找到合适的,Node.js 也自己编写了几个模块,典型的代表就是 Libuv。Libuv 是 Node.js 最核心最基础的模块,Node.js 完全基于 Libuv 而构建。

你可能听说过 Node.js 采用了基于事件的、单线程的异步 I/O 架构,这是 Node.js 最大的特点,也是它和其它脚本语言最大的区别,Node.js 的这种能力就是依赖 Libuv 实现的。
Libuv 如此强大,官方决定将它从 Node.js 中剥离出来,作为一个单独的网络库发布,并且开源免费。现在的 Libuv 已经变得非常流行,和传统的 Libevent 和 libev 库并称为“C/C++ 三大网络库”。

Node.js 之所以大名鼎鼎,主要是因为它采用了 V8 引擎和 Libuv 库:V8 引擎保证了 Node.js 运行高效,Libuv 库提供了基于事件循环的异步 I/O 能力。

  1. 如何启动服务器
    使用自带的http模块 直接引入即可启动一个服务
    node +文件名回车键直接运行
const http=require("http")
//request:请求   携带了请求的所有内容 ,包括请求方式、请求的地址、请求的参数
//response:响应  通过res来进行数据的返回
const server=http.createServer((req,res)=>{
	//响应一个hello world
	//.write() 响应的内容
	res.write("hello world") 
	//.end() 响应结束
	res.end()
})
//每一个服务 都应该具有一个独立端口号
//电脑就是一个台大的服务器,每一个运行在电脑上的软件,开辟一个服务
//每一个服务独立端口号,方便区分
//新产生的服务,不能和之前已经跑起来服务冲突 
//端口:listen
//由于当前文件是在本地运动 ,因此服务器对应本地服务器
//浏览器 地址栏默认发送的就一个请求 
// http://localhost:8088
//ctrl+c 关闭服务器
//listen()回调函数  服务器启动后直接运行
server.listen(8088,()=>{
	console.log("当前端口为8088")
})
  1. 使用fs模块操作静态文件
    fs模块 node自带模块
const fs=require("fs")
//fs.writeFile(路径,"内容",回调函数)
// 回调函数:当执行某些功能,完成以后自动调用的函数
//找到当前文件夹下的a.txt文件 添加内容hello world
fs.writeFile("./a.txt","hello world",err=>{//err错误的参数
	if(err){
		console.log(err)
		console.log('写入失败')
	}else{
		console.log("写入成功")
	}
})
//读取内容
//fs.readFile(路径,回调函数)
//data读取的内容
fs.readFile("./a.txt",(err,data)=>{
	if(err){
		console.log("读取错误")
	}else{
		console.log(data) //<Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64> Buffer二进制码
		console.log(data.toString()) 
		/*toString() 方法用于返回以一个字符串表示的 Number 对象值。
如果方法使用了原生的数据类型作为参数,返回原生数据类型的 String 对象值。
如果方法有两个参数, 返回用第二个参数指定基数表示的第一个参数的字符串表示形式。*/
	}
})
  1. 如何在服务器端打开网页
    http://localhost:8088/a.html 打开服务中a.html文件
    http://localhost:8088/b.html 打开b.html文件
const http=require("http")
const fs=require('fs')
const server=http.createServer((req,res)=>{
//根据前端发送过来请求地址不同,去打开不同的网页
console.log(req.url)// 输出 /a.html 
//获取到指定的地址  req.url
//只要本次请求是关于打开网页的 逻辑相同
	//所有打开网页的操作,整理到 一个分支中
    let url=req.url
    if(url.endsWith(".html")){//endsWith() 方法用来判断当前字符串是否是以指定的子字符串结尾的
	//服务器打开(读取)静态网页,响应给前端,因此浏览器就能展示页面 
	  fs.readFile(`.${url}`,(err,data)=>{
		  if(err){
			  console.log('打开错误')
			  res.write("404")
			  res.end()
		  }else{
			  res.write(data)
			  res.end()
		  }
	  })
   }
})

创建两个页面 命名为b.html,然后在服务器运行上面的代码,再在网页输入地址:http://localhost:8088/b.html 就打开了

  1. get请求参数的获取
const http=require("http")
const fs=require("fs")
//url模块 用于解析get请求 url的
const url=require("url")
//编写一个api接口 /login  携带用户名和密码 

//使用ajax进行接口的交互 
let users=[{name:"臧胜杰",pass:456},{name:"王二",upass:789}]
const server=http.createServer((req,res)=>{
	//req.url就是接口地址
	// console.log(req.url)
	//true将解析的结果转化为对象
	let {pathname,query}=url.parse(req.url,true)
	// console.log(pathname)
	// console.log(query)
	//分别拿出接口地址  /login
	//参数 {username:"臧胜杰",upass:123}
	if(pathname.endsWith(".html")){
		fs.readFile(`.${pathname}`,(err,data)=>{
			if(err){
				console.log(404)
			}else{
				res.write(data)
				res.end()
			}
		})
	}else if(pathname=="/login"){
		//让query依次的users中的数据进行对比 如果满足要求返回登录成功,相反则失败
		//先判断当前用户名是否存在
		let result=users.filter(item=>item.name==query.username)
		//result数组 .length>0 就证明用户存 否则不存在
		if(result.length>0){
			
		}else{
			//如果不存在给前端返回 用户名不存在
			let obj={
				message:"用户名不存在"
			}
			res.write(JSON.stringify(obj))
			//JSON.stringify() 方法将一个 JavaScript 对象或值转换为 JSON 字符串,
			//如果指定了一个 replacer 函数,则可以选择性地替换值,或者指定的 replacer 是数组,
			//则可选择性地仅包含数组指定的属性。
			res.end()
		}
	}
})
server.listen(8090,()=>{
	console.log("服务器已启动")
})

然后创建一个名为dl.html

    <p>
		用户名:<input type="text">
	</p>
	<p>&ensp;&ensp;码:<input type="text">
	</p>
	<button type="button">点击登录</button>
		// 点击登陆时 访问/login接口 并且将用户和密码携带
		// 如果网页是本地直接打开 请求的接口地址是localhost
		// ajax:同源策略 当前网页和请求的接口必须要在同一个服务上
		// 跨域请求 No 'Access-Control-Allow-Origin'
		$(function(){
			$("button").click(function(){
				//参数的校验
				$.ajax({
					url:"http://localhost:8090/login",
					type:"get",
					data:{
						username:$("input").eq(0).val(),
						upass:$("input").eq(1).val()
					},
					dataType:"json",
					success(res){
						console.log(res)
					},
					error(err){
						console.log(err)
					}
				})
			})
		})

在服务器运行上面的代码,再在网页输入地址:http://localhost:8090/dl.html 就打开了

  1. 拆分字符串
    需要在字符串中进行指定内容的提取 必然会存在特殊字符
    例如:
let str="/login?username=wangyi&upass=123"

可以利用特殊字符将两部分拆开 split()

let arr=str.split("?")
let path=arr[0]
//"username=wangyi&upass=123"转化为对象等号前为key value
let arr1=arr[1].split("&")
let query={}
arr1.forEach(item=>{
  //item username='wangyi'
  let arr2=item.split("=") //[username,wangyi]
  query[arr2[0]]=arr2[1]
})
console.log(query)

forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。
注意: forEach() 对于空数组是不会执行回调函数的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RORONOA~ZORO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值