node第一天

node第一天

  1. node环境安装

node下载

直接去node官网下载
LTS版:长期支持版(稳定版)
Current:体验版

安装

傻瓜式一路next

查看版本

打开控制台输入 node --version,会得到node版本号
在这里插入图片描述
查看npm

npm是node.js的包管理工具,npm在node.js安装的时候已经顺带装好了,在控制台输入npm --version,可以看到类似的输出

在这里插入图片描述

  1. 使用node执行js脚本

创建编写js脚本(即js文件)
打开终端(控制台)定位到脚本文件所在目录
输入node文件名执行对应的文件
要注意:不能使用node作为js文件的名字

  1. Hello Node!
    浏览器中的JavaScript是没有文件操作能力的,但是node中的JavaScript具有文件操作的能力

读取文件

//fs是file-system的简写,就是文件系统的意思
//在Node中,如果想要进行文件操作,就必须引入fs这个核心模块
//在fs这个核心模块中,提供了所有的文件操作相关的API
//例如:fs.readFile就是用来读取文件的

//1.使用require方法加载fs核心模块
var fs=require('fs');
//2.读取文件
	//第一个参数是要读取的文件路径
	//第二个参数是一个回调函数
		/*
		读取成功
			data 是读取到的数据
			error null
		读取失败
			data null
			error 错误对象
		*/
fs.readFile('hello.txt'function (error,data) {
    // 回调函数里的两个参数,第一个是错误对象,第二个是数据,位置不可以颠倒
	console.log(data.toString())
});

3. 写文件和简单的错误处理

写入文件

var fs=require('fs');
//第一个参数:文件路径
//第二个参数:文件内容
// 第三个参数:回调函数
	/*
	error
	成功:文件写入成功
		error是null
	失败:文件写入失败 
		error是错误对象
	*/
fs.writeFile('Hello.txt','大家好,我是node',function(error){
	console.log("文件写入成功")
})

新写入的内容会将原来的内容覆盖掉

var fs=require('fs');
//第一个参数:文件路径
//第二个参数:文件内容
// 第三个参数:回调函数
	/*
	error
	成功:文件写入成功
		error是null
	失败:文件写入失败 
		error是错误对象
	*/
fs.writeFile('Hello.txt','大家好,我是node',function(error){
	console.log("文件写入成功")
})
fs.readFile("Hello.txt",function (error,data) {
	console.log(data.toString())
})

运行结果:
在这里插入图片描述

错误处理

var fs=require('fs');
fs.readFile("Hello2.txt",function (error,data) {
	//注意此时我们要读的是Hello2.txt,此文件并不存在
	console.log(data)
})
/*if(第一个参数文件路径==true){
	把原来的内容覆盖掉
}else{
	在该路径下新建该文件
}*/  

运行结果:
在这里插入图片描述

此时Hello2.txt并不存在,所以读取并不成功,在这里报undefined,而实际上这里应该是一个错误。

var fs=require('fs');
fs.readFile("Hello2.txt",function (error,data) {
	//注意此时我们要读的是Hello2.txt,此文件并不存在
	console.log(error)
})

运行结果:
在这里插入图片描述
通过判断error是否存在,来确认是否有错误

var fs=require('fs');
fs.readFile("Hello2.txt",function (error,data) {
	//注意此时我们要读的是Hello2.txt,此文件并不存在
	console.log(error)
	if (error) {
		console.log("读取文件失败")
		return
	}
		console.log(data.toString())
	
})

运行结果:
在这里插入图片描述
写入错误也类似

var fs=require('fs');
fs.writeFile("Hello2***.txt","大家好,我是node",function (error) {
	//注意此时我们要读的是Hello2***.txt,windows系统不允许文件名中有“*”,所以本次写入会失败
	console.log(error)
	if (error) {
		console.log("读取文件失败")
	}
})

运行结果:
在这里插入图片描述

4. 简单的http服务
使用Node构建一个web服务器

//1.加载http核心模块
var http=require('http');
// 2.使用htpp。createServer(	)创建一个web服务器
// 返回一个Server实例
var server=http.createServer();

//3.服务器的作用
	/*
	提供服务:对数据的服务
	发送请求
	接受请求
	处理请求
	给个反馈(发送响应)
	注册request请求事件
	当客户端请求过来,自动触发服务器的request请求时间,然后执行第二个参数,:回调函数
	*/
server.on('request',function(){
	console.log("收到客户端请求")
})
// 4.绑定端口号,启动服务器(凡是涉及到网络的,都有端口号)
server.listen(3000,function(){
	console.log("服务器启动成功")

})

命令行启动

在这里插入图片描述
到浏览器输入http:127.0.0.1:3000,再查看终端
在这里插入图片描述

4. 发送响应

var http=require('http');
var server=http.createServer();
/*
request请求事件处理函数,需要接受两个参数
Request请求对象
	请求对象可以用来获取客户端的一些请求信息,例如请求路径
Response响应对象
	相对应对象可以用来给客户端发送响应消息	
	*/
server.on('request',function(request,response){
	console.log("收到客户端请求,请求路径是:"+request.url)
})
server.listen(3000,function(){
	console.log("服务器启动成功")
})

打开浏览器,输入http://127.0.0.1:3000/,再查看终端打开浏览器,输入http://127.0.0.1:3000/,再查看终端
在这里插入图片描述
尝试把浏览器url修改成http://127.0.0.1:3000/s/s/w等,这个时候终端是这样的
在这里插入图片描述
也就是说这里获取到的request就是我们浏览器url端口号后面的字符串
并且都是以“/”开头的

5. 根据不同请求路径返回不同数据

var http=require('http');
var server=http.createServer();
/*
request请求事件处理函数,需要接受两个参数
Request请求对象
	请求对象可以用来获取客户端的一些请求信息,例如请求路径
Response响应对象
	相对应对象可以用来给客户端发送响应消息	
	*/
server.on('request',function(request,response){
	//console.log("收到客户端请求,请求路径是:"+request.url)
	var url=request.url;
	if(url==='/'){
		response.end("index page");
	}else if(url==='/login'){
		response.end('login page')
	}else{
		response.end('404 page')
	}
})
server.listen(3000,function(){
	console.log("服务器启动成功")

})
var http=require('http');
var server=http.createServer();
/*
request请求事件处理函数,需要接受两个参数
Request请求对象
	请求对象可以用来获取客户端的一些请求信息,例如请求路径
Response响应对象
	相对应对象可以用来给客户端发送响应消息	
	*/
server.on('request',function(request,response){
	//console.log("收到客户端请求,请求路径是:"+request.url)
	var url=request.url;
	
	if(url==='/products'){
		var products=[
			{name:"apple X",price:"8999"},
			{name:"mate30 ",price:"5999"},
			{name:"mate40 pro",price:"12000"}
		];
		response.end(JSON.stringify(products))
	}
})
server.listen(3000,function(){
	console.log("服务器启动成功")

})

response.end()里面只能是字符串或二进制,上述代码中的对象,转成字符串才可以。

6. node中的js–核心模块
Node为js提供了很多服务器级别的API,这些API绝大多数都被包装到了一个具名的核心模块中了,例如文件操作的fs核心模块,http服务构建的http模块,path路径操作模块,os操作系统信息模块等等

var fs=require('fs')//require方法引用fs这个核心模块
var os=require('os')//用来获取机器信息
var path=require('path')//用来操作路径
console.log(path.extname('c:a/b/c/d/e/f/hello.txt'))//读出文件后缀名

7. node中的js–模块系统

浏览器中我们可以在html里引入多个js文件,但是在node里面,我们似乎只执行了一个js文件。
接下来,我们在同一个文件夹下新建两个js文件,分别为a.js和b.js

a.js中的代码

require是一个方法
它的作用就是用来加载模块的,在node中,模块有三种:

  1. 具名的核心模块,比如“fs”,“http”
  2. 用户自己编写的文件模块(本节重点讲)
  3. 第三方的模块
console.log('a start')
require ('./b.js')//注意在这里,必须以“./”或“../”开头
require ('./b.js')//后缀.js可以省略
console.log('a end')

b.js中的代码

console.log('b文件被加载执行了')
// require('./c.js')
//我们也可以在这里继续调用c.js

在node中没有全局作用域,只有模块作用域

a.js中声明的变量variable,到b文件中仍然可以声明,二者不冲突,不覆盖

在a里面写的函数,在b中也不可以被调用

外部访问不到内部,内部也访问不到外部

为什么”./"不可以省略呢?

既然是模块作用域,默认都是封闭的,那如何让模块之间进行通信呢?

​ 有时候,我们加载文件模块的目的不是为了简单的执行里面的代码,更重要的是为了使用里面的某个成员
新建a.js,b.js

a.js

// require方法有两个作用:
    // 加载文件模块并执行里面的代码
    // 拿到被家长文件模块导出的接口对象

// 在每个文件模块中都提供了一个对象exports,它默认是一个空对象
// 我们要做的是把所有需要被外部访问的成员挂载到exports中
var bExports=require('./b')

console.log(bExports.foo)

console.log(bExports.add(1,2))//调用b中的函数

b.js

var foo='bbb'

exports.foo='hello'//把字符串挂到exports这个空对象中

exports.add=function (x,y) {
	return x+y
}
// 把函数挂载到exports这个空对象中

7. ip地址和端口号的概念

所有联网的程序都需要联网通信
计算机只有一个物理网卡,而且局域网中网卡的地址是唯一的
网卡必须是通过唯一的ip地址来进行定位
ip定位到计算机,而端口号定位到该计算机上的那个程序
发给大家我的ip地址,和端口号,查看访问我的用户的ip和port

var http=require('http');
var server=http.createServer();

server.on('request',function(request,response){
	console.log(request.socket.remoteAddress,request.socket.remotePort)
})
server.listen(3000,function(){
	console.log("服务器启动成功")
})

8. 端口号补充

  • ip是用来定位计算机
  • 端口号是用来定位具体的应用程序
  • 一切需要联网通信的软件都会占用一个端口号
  • 端口号的范围从0~65535
  • 在计算机中有写默认端口号,最好不要去使用
  • 比如http服务的80。我们的网站上线部署的时候才使用80
  • 我们在开发过程中使用一些简单好记的比如3000,5000,8888等
  • 可以同时开启多个服务,但是一定要确保不同服务占用的端口号不一致
  • 在一台计算机中,同一个端口号在同一时间只能被同一个程序占用

9.响应式内容类型

解决乱码问题

var http=require('http');
var server=http.createServer();

server.on('request',function(request,response){
	response.end('你好,node')
})
server.listen(3000,function(){
	console.log("服务器启动成功了,可以通过http:127.0.0.1:3000来进行访问")

})

结果:
在这里插入图片描述
服务器默认发送的数据,其实是utf-8编码的内容,但是浏览器不知道,浏览器在不知道服务器响应内容编码格式的情况下,会按照当前操作系统的默认编码格式去解析中文操作系统默认是gbk
解决办法——告诉浏览器我给你发送的内容是什么编码的:

var http=require('http');
var server=http.createServer();

server.on('request',function(request,response){
	response.setHeader('Content-Type','text/plain;charset=utf-8')
	response.end('你好,node')
})
server.listen(3000,function(){
	console.log("服务器启动成功了,可以通过http:127.0.0.1:3000来进行访问")

})

结果:
在这里插入图片描述
在http协议中,就是告知浏览器我给你发送的数据内容是什么类型

var http=require('http');
var server=http.createServer();

server.on('request',function(request,response){
	var url=request.url
	
	if (url==='/plain') {
		response.setHeader('Content-Type','text/plain;charset=utf-8')
		response.end('<p>hello,世界</p>')
	}else if (url==='/html') {
		response.setHeader('Content-Type','text/html;charset=utf-8')
		response.end('<p>hello,世界</p>')
	}
	
})



server.listen(3000,function(){
	console.log("服务器启动成功了,可以通过http:127.0.0.1:3000来进行访问")

})

根据不同的类型,浏览器作不同的解读
text/plain是普通文本
text/html是html格式内容

10. 发送文件中的数据一级Content-type内容类型

html文件怎么发送

var http=require('http');
var fs=require('fs')
var server=http.createServer();

server.on('request',function(req,res){
	var url=req.url;

	if(url==='/'){
		fs.readFile('./index.html',function (error,data) {
			if (error) {
				res.setHeader('Content-Type','text/plain;charset=utf-8')
				res.end('文件读取失败')
			}else{
				res.setHeader('Content-Type','text/html;charset=utf-8')
				res.end(data)
			}
		})
	}
})

server.listen(3000,function(){
	console.log("server is running……")
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值